为什么此查询会重复结果?

时间:2014-04-04 13:27:51

标签: mysql sql

我在加入牌桌时不是很有经验,所以这可能是我加入牌桌的结果。我不太明白为什么这个查询会重复结果。例如,这应该只返回3个结果,因为我只有3行用于该特定作业和修订,但是它返回6,重复项与前3个完全相同。

          SELECT
               checklist_component_stock.id,
               checklist_component_stock.job_num,
               checklist_revision.user_id,
               checklist_component_stock.revision,
               checklist_category.name as category,
               checklist_revision.revision_num as revision_num,
               checklist_revision.category as rev_category,
               checklist_revision.per_workorder_number as per_wo_num,
               checklist_component_stock.wo_num_and_date,
               checklist_component_stock.posted_date,
               checklist_component_stock.comp_name_and_number,
               checklist_component_stock.finish_sizes,
               checklist_component_stock.material,
               checklist_component_stock.total_num_pieces,
               checklist_component_stock.workorder_num_one,
               checklist_component_stock.notes_one,
               checklist_component_stock.signoff_user_one,
               checklist_component_stock.workorder_num_two,
               checklist_component_stock.notes_two,
               checklist_component_stock.signoff_user_two,
               checklist_component_stock.workorder_num_three,
               checklist_component_stock.notes_three,
               checklist_component_stock.signoff_user_three
               FROM checklist_component_stock
               LEFT JOIN checklist_category ON checklist_component_stock.category
               LEFT JOIN checklist_revision ON checklist_component_stock.revision = checklist_revision.revision_num
               WHERE checklist_component_stock.job_num = 1000 AND revision = 1;

表格结构:

checklist_category

i

checklist_revision

i

checklist_component_stock

i

3 个答案:

答案 0 :(得分:2)

该行

LEFT JOIN checklist_category ON checklist_component_stock.category

肯定应该像

LEFT JOIN checklist_category ON checklist_component_stock.category = checklist_category.category

大多数其他dbms会报告语法错误,但MySQL将checklist_component_stock.category视为布尔值。对于MySQL,布尔值是一个数字,对于FALSE为0,对于TRUE为!= 0。因此,每个checklist_component_stock类别!= 0都连接到checklist_category中的所有记录。

答案 1 :(得分:0)

首先检查您的查询,因为您的第一个左连接中缺少连接。另外,如果您只想从查询中获取唯一行,请在选择...

之后使用distinct

答案 2 :(得分:0)

除了修正Thorsten Kettner的建议外,修改后的外键也没有了。我将checklist_component_stock.revision中的修订引用到checklist_revision.revision_num,而我应该将它引用到checklist_revision.id。