PHP/MYSQL按id查询“重复id”

5

我正在尝试从3个表格中获取结果,但是PART_ID在重复,一遍又一遍地显示相同的ID。我该如何解决这个问题?

<?php
    $product_list = "";
    $sql = mysql_query("SELECT * FROM PART, PART_TYPE, RACK");
    $productCount = mysql_num_rows($sql);
    if ($productCount >0){

    while($row= mysql_fetch_array($sql)){
                 $id = $row["PART_ID"];
                 $PART_DESC = $row["PART_DESC"];
                 $SERIAL_NUM = $row["SERIAL_NUM"];
                 $RACK_NUM = $row["RACK_NUM"];
                 $PART_TYPE_ID = $row["PART_TYPE_ID"];
                 $PART_TYPE_DESC = $row["PART_TYPE_DESC"];
                 $product_list .= " <strong>PART_ID:</strong> $id -<strong>$PART_DESC</strong> -<strong>Product Type</strong> $SERIAL_NUM - <em><strong>RACK_NUM</strong> $RACK_NUM  - <em> <strong>PART_TYPE_ID</strong> $PART_TYPE_ID  - <em> <strong>PART_TYPE_DESC </strong> $PART_TYPE_DESC   - <em> &nbsp; &nbsp; &nbsp; <a href='inventory_edit.php?pid=$id'>edit</a> &bull; <a href='inventory_list.php?deleteid=$id'>delete</a><br />";
    }

    }else 
        $product_list = "You have not items in the inventory yet"

?>

结果

PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R1S1 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R1S2 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R1S3 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R1S4 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R1S5 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R1S6 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R2S1 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R2S2 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R2S3 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R2S4 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R2S5 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R2S6 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R3S1 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R3S2 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete
PART_ID: 1001 -Power Mac G4 Desktop -Product Type XBO31 1WAJ3B - RACK_NUM R3S3 - PART_TYPE_ID 101 - PART_TYPE_DESC MAC -       edit • delete

enter image description here


1
你的联接没有任何条件。您只是从这三个表中检索每个行组合。 - Lightness Races in Orbit
你能给我一个解决这个问题的例子吗?我正在尝试通过扩展我在网上找到的教程来学习更多,但我还不是很擅长这方面的东西,任何帮助都将不胜感激。 - Michael Quiles
你已经向我们展示了你所“得到”的输出结果。那么你想要的输出结果是什么? - Hammerite
如果可能的话,我想要每个PART_ID只有1个结果。一旦我弄清楚了这一点,我就可以继续尝试更多的例子。 - Michael Quiles
你们的每个表格中有哪些列,它们之间又是如何关联的? - Gareth
@Michael:从一本好的MySQL书籍中学习,而不是在线“教程”。 - Lightness Races in Orbit
4个回答

6

如果您的查询中存在一对多关系(看起来是这样),则查询格式不正确。请根据某些条件链接表格,如下所示:

SELECT * FROM PART
JOIN PART_TYPE on PART.part_type = PART_TYPE.ID
JOIN RACK ON PART.part_rack = RACK.ID

或者类似这样。您想告诉数据库如何将这些表链接在一起。这就是它所做的。


4

您需要使用某些条件将表格连接在一起,例如:

SELECT PART_ID, PART_DESC, SERIAL_NUM, RACK_NUM, PART.PART_TYPE_ID, PART_TYPE_DESC
FROM PART
INNER JOIN PART_TYPE ON PART.PART_TYPE_ID = PART_TYPE.PART_TYPE_ID

基本上,这将实现从PART表获取所有行,并为我们找到的每一行匹配PART_TYPE表中的一行(条件是它们具有相同的PART_TYPE_ID)。如果在PART表的给定行中找不到与PART_TYPE表的匹配项,则该行将不包含在结果中。实际上,这意味着您只会获得具有有效对应零件类型的零件。
注意:使用SELECT *从表中选择所有列通常不受欢迎,因为它使维护变得困难。如果您曾经添加、删除或重新排列列,那么所有代码都将失效。因此,我更改了您的选择语句,以显式检索引用的列,以与代码中引用的顺序相同。
编辑:我在代码中省略了与RACK表的连接,因为您没有引用RACK.LOCATION列。如果这是一个错误,请像这样再加入另一个连接:
INNER JOIN RACK ON RACK.RACK_NUM = PART.RACK_NUM

在SELECT语句中添加LOCATION列到需要检索的列列表中。


2
根据您的图示:
SELECT * FROM PART
INNER JOIN PART_TYPE ON PART.PART_ID=PART_TYPE.PART_TYPE_ID
INNER JOIN RACK ON PART.RACK_NUM=RACK.RACK_NUM

应该做你想要的事情。

请注意,您无需加入RACK,因为他实际上没有在代码中引用RACK.LOCATION列。 - Martin Törnwall
我最终会做到,但我正在逐步实现。 - Michael Quiles
@Michael,那是因为我的答案有错误(PART.PART_ID 应该改为 PART.PART_TYPE_ID)。@Martin 的答案更好。 - Gareth

1
为了避免重复显示相同的结果,您需要使用DISTINCT,因此您可以尝试:
SELECT DISTINCT * FROM PART, PART_TYPE, RACK

这仅仅会过滤掉连接中每个表的每一列都相同的行。特别地,如果表上有唯一键(当然每个表应该有一个主键),那么这是完全多余的。 - Hammerite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接