【问题标题】:sql query not pulling records the samesql查询不拉记录相同
【发布时间】:2012-05-13 16:57:42
【问题描述】:

我有这个问题:

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,如果在两个查询中都找到正确的记录。我无法为我的生活弄清楚发生了什么。非常感谢任何帮助。

【问题讨论】:

  • where 和 group by 子句的目的是什么?如果没有聚合函数,分组是没有意义的,并且总是计算为真的 where 子句是没有意义的。但是,由于简化的选择确实找到了一些东西,因此请确保检索到的项目记录具有匹配的 book.id。没有它,你的内部连接将阻止任何东西出现。
  • 如果没有指定 where 条件,程序会自动生成默认值。另外,这实际上是从查询中提取的,但这是相关的部分。

标签: mysql


【解决方案1】:

您需要将 LEFT JOIN 与 matierial_types 一起使用,因为此表可能与书籍的 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`

【讨论】:

  • 用 LEFT JOIN 再试一次,你确定 accession_number 是一个字符串吗?
  • 这是由于缺少记录。仅当两个表都包含确切的 id 时,内连接才有效,但是左连接也包括空条目。实际上,在您的情况下,material_type 或 items 没有根据 join 语句中的条件记录
  • 将该解释添加到您的主要答案中。确切地说,是不存在的材料类型。所以正确的方法是,因为我需要这些项目,所以类型是左连接,项目是内连接。
【解决方案2】:

您在“Book”中似乎没有与“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`

【讨论】:

  • 其实有。这是我检查的第一件事
猜你喜欢
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多