2015-12-14 126 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'添加一個唯一索引,對吧?因此,該號碼和工具可以與同一指數相關聯。然後....我不知道....:-( –