mysql在多个表上进行选择和连接


mysql select and join on multiple tables

我有这样的表

product table: product_id | code
group table:   id | fk-product_id | id_code
grade table    id | fk-product_id | id_grade
person table   id | fk-product_id | id_person

我的sql查询是:

"SELECT *
    FROM product 
    JOIN group  ON  group.product_id = product_id
    JOIN grade  ON  grade.product_id = product_id
    JOIN person ON person.product_id = product_id
    WHERE  product.code='".$productCode."'");

我得到了正确的结果,但有太多的争吵。我认为我做得太过火了。

所有产品都在"产品"表中,但不必在"组"、"级别"或"人员"表中有相同的"id_product"。

在我的结果中有很多行我的结果被重复。我有没有办法避免这些重复?

有更好的方法来执行我的查询吗?

从原始查询中,您已经在组、级别和人员表中列出了列"fk-product_id",但您的查询显示为"product_id"。所以,我的意思是,您真正的列只是"product_id",而"fk-"只是一个引用,它是products表的外键。

也就是说,平等比较只是product_id。由于您没有用alias.field限定它,所以它可能正在获取所有内容,因为组中的每个记录都将始终具有自己的product_id=自己的productid。

此外,您提到并非所有表都有匹配的产品ID,因此您需要为其他表使用LEFT JOIN。。。调整为类似的内容

SELECT 
      p.*,
      gp.id_code,
      gd.id_grade,
      per.id_person
   FROM 
      product p
         LEFT JOIN group gp
            ON  p.product_id = gp.product_id
         LEFT JOIN grade gd
            ON  p.product_id = gd.product_id
         LEFT JOIN person per
            ON  p.product_id = per.product_id
   WHERE
      p.code='".$productCode."'";

但我要特别注意sql注入,因为您可能会在$productCode变量中获得恶意值。确保你把它清洗干净并逃走。

@5er,Left Join说,对于左侧的每个记录(在这种情况下,第一个是产品表),我想要所有记录。。。哦。。。顺便说一句我有其他表格(小组、年级和人员)。他们可能也有一个与产品表具有相同Product_ID值的记录。如果是这样的话,也要抓住这些碎片,但不要排除原始的产品记录。

现在,为什么你的查询失败了,我认为我描述得很好,但显然不是。你得到的是笛卡尔结果,这意味着对于左表(乘积)中的每一条记录,你得到的都是右侧表中的每条记录。。。所以,对于一个产品,如果你有20个小组,10个年级和100个人,你基本上会得到20000张记录。

所以你加入

JOIN group  ON  group.product_id = product_id

如果您符合产品参考的要求,本可以工作,但记录较少

JOIN group  ON  group.product_id = PRODUCT.product_id

否则,它只是将自己的产品ID与自己进行比较,然后说。。。是的,这些到产品ID匹配(即使是同一条记录),它返回了它。引擎无法为您猜测连接的第二部分指的是哪个表,尤其是当查询中总共引用了4个表,并且EACH有一个"product_ID"列时。因此,我强烈建议对于所有查询,将所有字段限定为alias.field,包括选择字段列表中的字段。然后,任何其他试图在未来帮助你的人,甚至接替你的人都知道领域在哪里。防止查询中出现歧义。

您的选择与上面的表/列名不匹配。例如,在表product中,您说您有列id_product,但在select中,您使用product.id而不是product.id_product。这可能是完全不同的列。

您的结果是重复的,因为JOIN正在联接表,但您没有筛选其中一个JOIN匹配,而另一个不匹配的情况。

试试这个:

SELECT *
FROM product 
JOIN group  ON  group.product_id = product.id
JOIN grade  ON  grade.product_id = product.id
JOIN person ON person.product_id = product.id
WHERE  product.code='".$productCode."'
GROUP BY product.id