2012-05-13 89 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