MySQL - 唯一行,仅对应于3个表中的一个
以下查询正确地按预期方式提取数据,但左表与lnk_cat_isrc
表连接并通过该表连接到catalogue
表,如果存在多个项目,则返回重复数据catalogue
从isrc
表具有相同的ISRC代码:MySQL - 唯一行,仅对应于3个表中的一个
SELECT
isrc.ISRC,
isrc.Track_Name,
isrc.ArtistName,
isrc.TitleVersion,
isrc.Track_Time,
`isrc_performer`.`PerformerName` ,
`performer_category`.`PerformerCategory` ,
`isrc_performer`.`PerformerRole` ,
`isrc`.`isrc_ID`,
`isrc_performer`.`Perf_ID`
FROM `isrc`
LEFT JOIN `isrc_performer` ON (isrc.isrc_ID = isrc_performer.isrc_ID)
LEFT JOIN `performer_category` ON (performer_category.PerfCat_ID = isrc_performer.PerfCat_ID)
LEFT JOIN `lnk_cat_isrc` ON (lnk_cat_isrc.isrc_ID = isrc.isrc_ID)
LEFT JOIN `catalogue` ON (catalogue.ID = lnk_cat_isrc.cat_id)
ORDER BY isrc_ID desc LIMIT 0 , 10
";
我不能isrc
使用group by
,因为isrc_performer
表可以有不止一个演员到一个ISRC。
所以关系是这样的: catalogue
表中的几项从isrc
表中可以有几个相同的项。反过来,每个isrc
表可在isrc_performer
表中有多个条目。
我想要的是显示isrc_performer
与每个isrc相关的所有相应数据,但不会重复从catalogue
表中的每个项目。 我也想显示其余所有“空”isrcs(那些在isrc_performer
表中没有任何数据)
你能给我任何想法吗?
P.S.尽管我并没有从catalogue
表中抽取任何数据,但我使用它来通过目录号进行搜索,当用户为$where_condition
变量定义搜索条件时,因此我需要将其保留在查询中。 即$where_condition = "catalogue.Catalogue LIKE '%test%' OR ISRC LIKE '%test%' OR Track_Name LIKE '%test%' OR ArtistName LIKE '%test%' OR TitleVersion LIKE '%test%' OR PerformerName LIKE '%test%' OR PerformerCategory LIKE '%test%' OR PerformerRole LIKE '%test%'";
------ UPD:
试图以图形方式表示这3个关系可能变化:
cat1 - isrc1 - performer1
isrc2 - performer1
- performer2
- performer3
cat2 - isrc2 - performer1
- performer2
- performer3
- isrc3 - performer2
- performer4
cat3 - isrc4
- isrc1 - performer1
UPD(添加图片)
这里是屏幕打印。正如你在图片1上看到的那样,有9行有相同的isrc
数字,但是有三个重复的表演者Jason,David,Paul。
这是因为3个不同的目录项具有此确切ISRC与3个不同的表演者逐PIC 2
= 1(ISRC)* 3(目录)* 3(表演者)= 9行输出
我只想要的是,Performers
网格将只显示这isrc
为每个表演者的3行。
---重新排列答案以将“最佳”选项放在最上面..但所有这一切都是零..没有任何来自lnk_cat_isrc或目录的数据被返回,为什么目录上的过滤使得区别?我们将返回所有isrc而不管任何过滤,因为它是左连接...
因此,这给带给样本数据的问题带来了什么样的预期结果。
可能更优雅 ...(但不知道这是否会更快)的移动距离存在,只是使用不同的子查询这样的目录查询总是每ISRC返回1行;解决保留左连接的1-M问题,从而保持isrc记录不在目录限制中。 返回所有isrc信息执行者信息(如果存在),执行者类别信息(如果存在)以及目录信息(仅当与商品目录过滤器匹配)。
SELECT isrc.ISRC
, isrc.Track_Name
, isrc.ArtistName
, isrc.TitleVersion
, isrc.Track_Time
,`isrc_performer`.`PerformerName`
,`performer_category`.`PerformerCategory`
,`isrc_performer`.`PerformerRole`
,`isrc`.`isrc_ID`
,`isrc_performer`.`Perf_ID`
FROM `isrc`
LEFT JOIN `isrc_performer`
ON isrc.isrc_ID = isrc_performer.isrc_ID
LEFT JOIN `performer_category`
ON performer_category.PerfCat_ID = isrc_performer.PerfCat_ID
LEFT JOIN (SELECT distinct lnk_cat_isrc.isrc_ID
FROM `lnk_cat_isrc`
INNER JOIN `catalogue`
ON catalogue.ID = lnk_cat_isrc.cat_id
WHERE...) DCat
ON Dcat.isrc_ID = isrc.isrc_ID
ORDER BY isrc_ID desc
LIMIT 0 , 10;
正如您指出连接导致问题。所以消除连接并使用存在的符号。由于您没有从目录中选择任何值,因此独特也会奏效;尽管存在应该更快。
快,但不包括所有的ISRC记录......(不知道为什么还是不存在,也应该把他们的...)
SELECT isrc.ISRC
, isrc.Track_Name
,isrc.ArtistName
,isrc.TitleVersion
,isrc.Track_Time
,`isrc_performer`.`PerformerName`
,`performer_category`.`PerformerCategory`
,`isrc_performer`.`PerformerRole`
,`isrc`.`isrc_ID`
,`isrc_performer`.`Perf_ID`
FROM `isrc`
LEFT JOIN `isrc_performer`
ON (isrc.isrc_ID = isrc_performer.isrc_ID)
LEFT JOIN `performer_category`
ON (performer_category.PerfCat_ID = isrc_performer.PerfCat_ID)
WHERE EXISTS (SELECT *
FROM `lnk_cat_isrc`
INNER JOIN `catalogue`
ON catalogue.ID = lnk_cat_isrc.cat_id
--and your other criteria
WHERE (lnk_cat_isrc.isrc_ID = isrc.isrc_ID)
)
OR NOT EXISTS (SELECT *
FROM `lnk_cat_isrc`
WHERE lnk_cat_isrc.isrc_ID = isrc.isrc_ID
ORDER BY isrc_ID desc
LIMIT 0 , 10
或使用SELECT DISTINCT简单的直线前进;但很慢
SELECT isrc.ISRC
, isrc.Track_Name
,isrc.ArtistName
,isrc.TitleVersion
,isrc.Track_Time
,`isrc_performer`.`PerformerName`
,`performer_category`.`PerformerCategory`
,`isrc_performer`.`PerformerRole`
,`isrc`.`isrc_ID`
,`isrc_performer`.`Perf_ID`
FROM `isrc`
LEFT JOIN `isrc_performer`
ON (isrc.isrc_ID = isrc_performer.isrc_ID)
LEFT JOIN `performer_category`
ON (performer_category.PerfCat_ID = isrc_performer.PerfCat_ID)
LEFT JOIN `lnk_cat_isrc`
ON (lnk_cat_isrc.isrc_ID = isrc.isrc_ID)
LEFT JOIN `catalogue`
ON (catalogue.ID = lnk_cat_isrc.cat_id)
--AND (other criteria on catalog here, cause in a where clause you left joins will behave like inner joins)
ORDER BY isrc_ID desc
LIMIT 0 , 10;
omg!这看起来正是我需要的......让我跑一些测试 – Elen
权,'exist' deffo运行速度更快,但它仍然作为我的原始查询 - 重复所有行每个'catalogue'项目...'Distinct'不正是我期待的是什么,但速度较慢......是的,当我指定一个cat.num时,我没有得到没有表演者的'isrc' ... – Elen
这对我来说没有多大意义存在不能将目录中的重复记录作为目录不再加入。 ahhh .. lnk_cat_isrc有cat_ID,我们需要移动它的连接到存在以及...因为你不显示数据形式lnk_cat_isrc它应该工作...这解释了为什么独特的工作。而这并没有; P不知道如果存在应该是一个左连接,或者如果它可能是一个内部...我会留下让你思考;它对你必须放置目录关键词/过滤器的位置有所影响。 – xQbert
请参阅[我为什么应该提供一个用于我认为是非常简单的SQL查询的MCVE](http://meta.*.com/questions/333952/why-should-i-提供-AN-MCVE换什么,似乎对我将要-A-极简单的SQL查询) – Strawberry
@Strawberry我已经更新了我的问题 – Elen
所以我想'distinct'没有解决不了的重复的问题。那么它不是一个真正的重复问题,而是一个重复的价值prolbme?你不想'看到列值重复?但是,你没有任何次序会使重复的值有意义。一个预期结果的例子将有助于显示你现在得到的和你想要的。 – xQbert