Mysql连接:仅当连接中的多行匹配时才选择
我想知道这里是否有人能帮我重新表述一下,这样我就只能从Mysql连接:仅当连接中的多行匹配时才选择,mysql,join,Mysql,Join,我想知道这里是否有人能帮我重新表述一下,这样我就只能从works中得到结果,如果worksid+prod\u instruments\u id++number都可以在works\u instruments中找到 这就是我所拥有的: SELECT `works`.`id`, `composers`.`first_name` FROM `works` JOIN `composers` ON `works`.`composers_id` = `composers`.`i
works
中得到结果,如果works
id
+prod\u instruments\u id
++number
都可以在works\u instruments
中找到
这就是我所拥有的:
SELECT
`works`.`id`,
`composers`.`first_name`
FROM `works`
JOIN `composers` ON `works`.`composers_id` = `composers`.`id`
JOIN `works_instruments` ON `works`.`id` = `works_instruments`.`works_id`
WHERE
(true)
AND `composers`.`full_name` LIKE '%karl friedrich abel%'
AND `works_instruments`.`prod_dd_instruments_id` = 15
AND `works_instruments`.`number` >= 1
AND `works_instruments`.`prod_dd_instruments_id` = 5
AND `works_instruments`.`number` >= 1
AND `works`.`work_no` <> '001' AND `works`.`short_title` NOT LIKE '%*Works'
ORDER BY
`composers`.`last_name`,
`composers`.`first_name`,
`works`.`full_title`
LIMIT 0,50
选择
`works`.`id`,
`作曲家“名字”
来自“works”
加入'works'上的'composers'。'composers\u id`='composers`.'id`
在“works”上加入“works\u instruments”。“id”=“works\u instruments”。“works\u id”
哪里
(对)
还有“作曲家”。“全名”如“%karl friedrich abel%”
和'works\u instruments'。'prod\u dd\u instruments\u id`=15
和'works\u instruments'。'number`>=1
和'works\u instruments'。'prod\u dd\u instruments\u id`=5
和'works\u instruments'。'number`>=1
还有'works'。'work\u no'001'和'works'。'short\u title'不像'%*works'
订购人
`作曲家`.`姓`,
`作曲家`.`名字`,
`作品`.`全名`
限值0,50
现在,这不会返回任何结果。
然而,这确实:
SELECT
`works`.`id`,
`composers`.`first_name`
FROM `works`
JOIN `composers` ON `works`.`composers_id` = `composers`.`id`
JOIN `works_instruments` ON `works`.`id` = `works_instruments`.`works_id`
WHERE
(true)
AND `composers`.`full_name` LIKE '%karl friedrich abel%'
AND `works_instruments`.`prod_dd_instruments_id` = 15
AND `works_instruments`.`number` >= 1
AND `works`.`work_no` <> '001' AND `works`.`short_title` NOT LIKE '%*Works'
ORDER BY
`composers`.`last_name`,
`composers`.`first_name`,
`works`.`full_title`
LIMIT 0,50
SELECT
`works`.`id`,
`composers`.`first_name`
FROM `works`
JOIN `composers` ON `works`.`composers_id` = `composers`.`id`
JOIN `works_instruments` ON `works`.`id` = `works_instruments`.`works_id`
WHERE
(true)
AND `composers`.`full_name` LIKE '%karl friedrich abel%'
AND `works_instruments`.`prod_dd_instruments_id` = 5
AND `works_instruments`.`number` >= 1
AND `works`.`work_no` <> '001' AND `works`.`short_title` NOT LIKE '%*Works'
ORDER BY
`composers`.`last_name`,
`composers`.`first_name`,
`works`.`full_title`
LIMIT 0,50
选择
`works`.`id`,
`作曲家“名字”
来自“works”
加入'works'上的'composers'。'composers\u id`='composers`.'id`
在“works”上加入“works\u instruments”。“id”=“works\u instruments”。“works\u id”
哪里
(对)
还有“作曲家”。“全名”如“%karl friedrich abel%”
和'works\u instruments'。'prod\u dd\u instruments\u id`=15
和'works\u instruments'。'number`>=1
还有'works'。'work\u no'001'和'works'。'short\u title'不像'%*works'
订购人
`作曲家`.`姓`,
`作曲家`.`名字`,
`作品`.`全名`
限值0,50
这就是:
SELECT
`works`.`id`,
`composers`.`first_name`
FROM `works`
JOIN `composers` ON `works`.`composers_id` = `composers`.`id`
JOIN `works_instruments` ON `works`.`id` = `works_instruments`.`works_id`
WHERE
(true)
AND `composers`.`full_name` LIKE '%karl friedrich abel%'
AND `works_instruments`.`prod_dd_instruments_id` = 15
AND `works_instruments`.`number` >= 1
AND `works`.`work_no` <> '001' AND `works`.`short_title` NOT LIKE '%*Works'
ORDER BY
`composers`.`last_name`,
`composers`.`first_name`,
`works`.`full_title`
LIMIT 0,50
SELECT
`works`.`id`,
`composers`.`first_name`
FROM `works`
JOIN `composers` ON `works`.`composers_id` = `composers`.`id`
JOIN `works_instruments` ON `works`.`id` = `works_instruments`.`works_id`
WHERE
(true)
AND `composers`.`full_name` LIKE '%karl friedrich abel%'
AND `works_instruments`.`prod_dd_instruments_id` = 5
AND `works_instruments`.`number` >= 1
AND `works`.`work_no` <> '001' AND `works`.`short_title` NOT LIKE '%*Works'
ORDER BY
`composers`.`last_name`,
`composers`.`first_name`,
`works`.`full_title`
LIMIT 0,50
选择
`works`.`id`,
`作曲家“名字”
来自“works”
加入'works'上的'composers'。'composers\u id`='composers`.'id`
在“works”上加入“works\u instruments”。“id”=“works\u instruments”。“works\u id”
哪里
(对)
还有“作曲家”。“全名”如“%karl friedrich abel%”
和'works\u instruments'。'prod\u dd\u instruments\u id`=5
和'works\u instruments'。'number`>=1
还有'works'。'work\u no'001'和'works'。'short\u title'不像'%*works'
订购人
`作曲家`.`姓`,
`作曲家`.`名字`,
`作品`.`全名`
限值0,50
你能帮忙吗
我还尝试了左键和右键连接,但结果仍然为空(我只在此处粘贴左键):
选择
`works`.`id`,
`作曲家“名字”
来自“works”
加入'works'上的'composers'。'composers\u id`='composers`.'id`
在'works'上左键连接'works'u instruments'。'id`='works'u instruments`.'works'u id`
哪里
(对)
还有“作曲家”。“全名”如“%karl friedrich abel%”
和'works\u instruments'。'prod\u dd\u instruments\u id`=15
和'works\u instruments'。'number`>=1
和'works\u instruments'。'prod\u dd\u instruments\u id`=5
和'works\u instruments'。'number`>=1
还有'works'。'work\u no'001'和'works'。'short\u title'不像'%*works'
订购人
`作曲家`.`姓`,
`作曲家`.`名字`,
`作品`.`全名`
限值0,50
如果仪器没有uniqe ID,工作是否有问题?
请参见此处的works\u instruments
屏幕截图:
如果字段可以同时=15和=5,则没有数值。相反,您可以执行“IN(15,5)”,按works.id分组,并计算不同的prod_dd_instruments_id值以查看是否有两个;或者使用不同的条件集对同一个表进行两个单独的联接
编辑:有了您在下面提供的其他信息,类似的内容可能会更有帮助
SELECT works.*, composers.*
, SUM(IF(wi.prod_dd_instruments_id=15, wi.number, 0)) AS count15
, SUM(IF(wi.prod_dd_instruments_id=5, wi.number, 0)) AS count5
FROM works
INNER JOIN `composers` ON `works`.`composers_id` = `composers`.`id`
LEFT JOIN `works_instruments` AS wi ON `works`.`id` = wi.`works_id`
WHERE [the other criteria you had]
GROUP BY works.id
HAVING count15 > 1 AND count5 > 1
;
请注意,此查询仅适用于“5&15”;尽管(从您的“(true)
”判断,我冒昧地猜测您至少部分地在代码中构造查询,因此我认为将上述代码变得更灵活一点不会太困难。字段不能同时=15和=5。相反,您可以在(15,5)中执行“in”,按works.id分组,并计算不同的prod_dd_instruments_id值,以查看是否有两个;或者使用不同的条件集对同一个表进行两次单独的联接
编辑:有了您在下面提供的其他信息,类似的内容可能会更有帮助
SELECT works.*, composers.*
, SUM(IF(wi.prod_dd_instruments_id=15, wi.number, 0)) AS count15
, SUM(IF(wi.prod_dd_instruments_id=5, wi.number, 0)) AS count5
FROM works
INNER JOIN `composers` ON `works`.`composers_id` = `composers`.`id`
LEFT JOIN `works_instruments` AS wi ON `works`.`id` = wi.`works_id`
WHERE [the other criteria you had]
GROUP BY works.id
HAVING count15 > 1 AND count5 > 1
;
请注意,此查询仅适用于“5&15”;不过(从“(true)
”判断)我冒昧地猜测,您至少在代码中构建了部分查询,因此我认为将上面的代码变得更灵活一点不会太困难。谢谢。这听起来很有希望-但是,我不确定实际如何做。请注意,我也在寻找works\u instruments
number
:works\u仪器
number
>=1…我可以在(5,15)中使用要请求prod\u instruments\u id
-但我如何在中也请求number
?@JohnK根据OP,目前您只需检查number>=1
两次。此外,两次加入表可能比在中加入更好;在中加入是一种薄型的或,以及或是的,我刚刚意识到我在检查数字两次。这使事情变得更加复杂,因为我检查数字两次的原因是:我的意思是检查是否有1个或更多的工具5和1个或更多的工具15。我想这可能会改变很多事情。我需要在works\u instruments
中添加一个唯一的索引,对吗?这样数字和仪器就可以与同一个索引关联。然后……我不知道-(@JohnK根据目前给出的信息,似乎不需要任何唯一性索引;但是如果您打算在works\u instruments中为每个prod\u dd\u instruments\u id
和works\u id
对只指定一行。)