MySQL Query返回重复项

时间:2012-03-16 20:10:21

标签: php mysql sql

我是SQL的新手

当我执行以下查询时,它返回以下结果:

SELECT table1.image_name, table1.item_id
FROM table1, table2, table3
WHERE table2.catagory="item"
AND table3.account_id=59

image_name    image_id
-------------------------
d9.jpg      89
d9.jpg      89
d9.jpg      89
d9.jpg      89
d10.jpg      90
d10.jpg      90
d10.jpg      90
d10.jpg      90
etc.....

结果重复相同的属性四次!我不明白为什么会这样,我无法在任何地方找到理由!

我有3个表,table1 PK(image_id)在Item中被引用为FK。项目PK(Item_id)在表3中用FK引用。 table3具有表4(account_id)和table2(item_id)的复合键。

我的查询显然是错误的,但我不明白为什么?我希望有人可以对结果提供解释!或帮我指出正确的方向!

由于

7 个答案:

答案 0 :(得分:5)

您列出了3个表,并且只加入其中两个表。 这意味着你将从连接中获得一行,并且它将对第三个表中的每一行重复一次(在你的情况下为table1)

答案 1 :(得分:3)

您必须明确说明加入条件 - 否则您将获得所有项目的所有3个表格的笛卡儿积分59

where table1.image_id = table2.item_id
and table2.item_id = table3.item_id
and ...

答案 2 :(得分:1)

在这种情况下,您需要使用DISTINCT,因为您有多行匹配相同的信息:

SELECT DISTINCT table1.image_name, table1.item_id 
FROM table1, table2, table3 
WHERE table2.catagory="item" 
AND table3.account_id=59

但是,正如其他人所提到的,您需要指定加入您正在使用的表格的条件,例如:

SELECT DISTINCT table1.image_name, table1.item_id 
FROM table1 
JOIN table2 on table2.item_id = table1.item_id
JOIN table3 on table3.item_id = table1.item_id
WHERE table2.catagory="item" 
AND table3.account_id=59

或者:

SELECT DISTINCT table1.image_name, table1.item_id 
FROM table1, table2, table3
WHERE table1.item_id = table2.item_id 
AND table1.item_id = table2.item_id
AND table2.catagory="item" 
AND table3.account_id=59

答案 3 :(得分:1)

也许我误解了这个问题,但除了上面提到的海报中添加“Distinct”之外,我认为你还需要将表3和表2之间的关系放在Where子句中。根据你的描述,我认为像下面这样的东西会起作用。可能需要一些额外的条件,具体取决于表格的实际结构。

SELECT DISTINCT table1.image_name, table1.item_id 
FROM table1, table2, table3 
WHERE    table2.catagory="item"
 AND table3.account_id=59 
 AND table3.item_id = table2.item_id

答案 4 :(得分:1)

您获得多个结果,因为您没有指定连接条件。外键关系很好,但您需要指定它们适用于您的查询:

SELECT table1.image_name, table1.item_id
FROM table1, table2, table3
WHERE table2.catagory="item"
AND table3.account_id=59
AND table1.id = table2.item_id
AND table2.item_id = table3.id

注意最后两个条件。您需要根据自己的需要进行更改。

答案 5 :(得分:0)

SELECT DISTINCT table1.image_name, table1.item_id FROM table1, table2, table3 WHERE table2.catagory="item" AND table3.account_id=59

虽然这更像是一种解决方法..

如果您可以更清楚地指定表格的结构,那将会很有帮助

答案 6 :(得分:0)

您可能没有选择某些列,这会使该行看起来唯一。因此,可能您的查询工作正常,但是,由于您未选择所有列,因此它们显示为重复行。