SQL左连接问题

时间:2011-08-10 21:01:10

标签: mysql left-join

我正在创建一个清单样式的程序,其中文件被分配给清单,并且您检查某些文件的清单中的项目。我正在尝试运行一个查询,该查询返回特定清单项目的所有READY文件(订购项目)。

因此,例如,我正在尝试查看哪些文件已准备好用于清单项目编号3,因此我需要找到所有已标记为已检查项目编号2的文件,但不是项目编号3。

我也不想使用子查询,即使我知道子查询可以解决这个问题(这就是为什么需要这么长时间),因为这个查询将针对每个核对表项运行,我觉得这里的子查询会对性能产生负面影响。

到目前为止,这是我的查询:

SELECT
    DISTINCT f.filename, f.id
FROM
    files f LEFT JOIN checklist_item_checklist cic1 LEFT JOIN checklist_check cc1 ON
    cc1.checklist_item_checklist_id = cic1.checklist_item_checklist_id ON
    cc1.file_id != f.id,checklist_item_checklist cic2,
    checklist_check cc2
WHERE
    cic1.checklist_item_checklist_id = 2 AND
    cic2.order_number = cic1.order_number - 1 AND
    cic1.checklist_id = cic2.checklist_id AND
    cc2.checklist_item_checklist_id = cic2.checklist_item_checklist_id AND
    cc2.file_id = f.id

表结构是:

文件

  • id(PK)
  • 文件名

checklist_item_checklist

  • checklist_item_checklist_id(PK)
  • ORDER_NUMBER

checklist_check

  • file_id(FK to files.id)
  • checklist_item_checklist_id(FK to checklist_item_checklist.checklist_item_checklist_id)

谢谢!

1 个答案:

答案 0 :(得分:1)

您的查询中有很多语法错误。我相信你需要一个子查询。

这应该有效:

SELECT f.id, f.filename
FROM files f 
JOIN checklist_check cc ON cc.file_id = f.id
JOIN checklist_item_checklist cic ON cic.checklist_item_checklist_id = cc.checklist_item_checklist_id AND cc.order_number = 2
WHERE f.id not in(
    SELECT f.id,
    FROM files f 
    JOIN checklist_check cc ON cc.file_id = f.id
    JOIN checklist_item_checklist cic ON cic.checklist_item_checklist_id = cc.checklist_item_checklist_id AND cc.order_number = 3)