2012-05-13 126 views
2

我有這個疑問:sql查詢不拉記錄相同

SELECT Book.title, Book.copyright, Book.publisher, Book.id, 
    MaterialType.type, Item.id as item_id, 100 as relevance FROM `books` AS `Book` 
inner JOIN `material_types` AS `MaterialType` ON (`MaterialType`.`id` = `Book`.`material_type_id`) 
inner JOIN `items` AS `Item` ON (`Item`.`book_id` = `Book`.`id` AND `Item`.`accession_number` = '0936') 
WHERE 1 = 1 GROUP BY `Book`.`id` 

其拉什麼。但是,如果我做這個查詢它找到正確的記錄:

SELECT * FROM `items` AS `Item` WHERE `Item`.`accession_number` = '0936' 

儘管最奇怪的部分,其他記錄它將工作。如果我使用accession_number 0396,如果在兩個查詢中找到正確的記錄。我不能爲了我的生活而弄清楚發生了什麼。任何幫助是極大的讚賞。

+0

什麼是where和group by子句的用途?沒有集合函數分組是毫無意義的,並且總是評估爲真的where子句是沒有意義的。但是,由於簡化選擇確實找到了某些內容,請確保檢索到的項目記錄具有匹配的book.id.沒有這個,你的內聯會阻止任何東西出現。如果沒有指定where條件,程序將自動生成一個默認值 –

+0

。再加上,這實際上是從查詢中提取的,但這是相關的部分。 – LordZardeck

回答

1

您需要使用LEFT與matierial_types JOIN,因爲它是可能的,這表沒有的書相同materialType ID 試試這個

SELECT Book.title, Book.copyright, Book.publisher, Book.id, 
    MaterialType.type, Item.id as item_id, 100 as relevance FROM `books` AS `Book` 
LEFT JOIN `material_types` AS `MaterialType` ON (`MaterialType`.`id` = `Book`.`material_type_id`) 
LEFT JOIN `items` AS `Item` ON (`Item`.`book_id` = `Book`.`id`) 
WHERE `Item`.`accession_number` = '0936' 
GROUP BY `Book`.`id` 
+0

nope,仍然沒有 – LordZardeck

+0

用LEFT JOIN再試一次,你確定accession_number是一個字符串嗎? –

+0

這工作。如果你解釋它爲什麼,我會加1。 – LordZardeck

0

它看起來像你在「書」的條目這對應於一個'accession_number'爲0936的項目。右項加入項目應該揭示這一點:

SELECT Book.title, Book.copyright, Book.publisher, Book.id, 
    MaterialType.type, Item.id as item_id, 100 as relevance FROM `books` AS `Book` 
left JOIN `material_types` AS `MaterialType` ON (`MaterialType`.`id` = `Book`.`material_type_id`) 
right JOIN `items` AS `Item` ON (`Item`.`book_id` = `Book`.`id` AND `Item`.`accession_number` = '0936') 
WHERE 1 = 1 GROUP BY `Book`.`id` 
+0

實際上有。那是我檢查的第一件事 – LordZardeck