2015-12-14 105 views
1

我在想这里的某个人是否可以帮我重述这个,所以我只从works得到结果if worksid + prod_instruments_id + number全部都在works_instrumentsMysql JOIN:只有在多个连接匹配的行匹配时才会选择

这是我有:

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 

眼下这种不返回任何结果。 但是这并不:

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 

你能帮忙吗?

我也尝试过左,右加盟,但仍然是一个空的结果(我只在这里贴左):

SELECT 
    `works`.`id`, 
    `composers`.`first_name` 
FROM `works` 
    JOIN `composers` ON `works`.`composers_id` = `composers`.`id` 
    LEFT 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_instruments没有潮头ID的问题? 见的works_instruments这里截图: Screenshot

+0

而不是图片,在sqlfiddle.com上设置一些东西会让人们更容易得到答案。 – miken32

+0

ok - 谢谢。下次我会记住这一点。以前没有尝试过 - 但我会找出答案。 –

+0

非常简单,只需使用模式窗口来创建表格并插入一些数据,然后使用查询窗口来运行您的查询,并在您的问题中包含链接,最重要的是,它可以让人们尝试不同的事情,并且看看表格的真实外观 – miken32

回答

0

没有数值,其中一个字段可以= 15,= 5在同一时间。相反,你可以通过works.id做“IN(15,5)”,然后计算不同的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)”我hazarding你部分的代码构建查询在租赁猜测来判断,所以我认为这将不会太困难,使上述多一点的代码灵活。

+0

谢谢,这听起来很有希望 - 但是,我不确定如何真正做到这一点。我也在寻找'work_instruments'.'number':'works_instruments'.'number'> = 1 ...我可以使用IN(5,15)来请求'prod_instruments_id' - 但我怎么也要求'号码在? –

+0

@JohnK根据OP,目前你只是检查'number> = 1'两次。另外,加入表格两次可能比加入'IN'更好;一个'IN'是一个简单的'OR','OR's通常会杀死你在MySQL中可能有的任何索引好处。 – Uueerdo

+0

是的,我也刚刚意识到我正在检查两次。这使事情变得更加复杂 - 因为我检查数字的原因是:我想检查是否有1个或更多的仪器5和1个或更多的仪器15.我想这可能会改变相当多的东西。我需要为'works_instruments'添加一个唯一索引,对吧?因此,该号码和工具可以与同一指数相关联。然后....我不知道....:-( –

相关问题