SQL查询三个不同的表

时间:2010-05-17 10:40:15

标签: php sql mysql join

我有三张桌子

CATS
id           name
------------------------------
1            category1
2            category2
3            category3
4            category4


PRODUCT
id           name
------------------------------
1            product1
2            product2



ZW-CAT-PRODUCT
id_cats      id_product
------------------------------
1            1
3            1
4            2

现在我想获得我的产品及其类别

product1 => category1,category3
product2 => category4

有没有办法用一个mysql查询获取这个数组(或对象或东西)? 我尝试了JOINS,但似乎这不是我需要的,或者?

目前我正在使用3个查询(我认为太多了)。

有什么建议吗?

修改

另一方面,如果我想获得特定类别的所有产品怎么办? 这可以在一个查询中完成吗?

3 个答案:

答案 0 :(得分:3)

您可以使用GROUP_CONCAT在结果中获取单独的列表。

SELECT p.*, 
       GROUP_CONCAT(c.name SEPARATOR ',') as cats
FROM PRODUCT p
LEFT JOIN ZW-CAT-PRODUCT l
  ON l.id_product=p.id
LEFT JOIN CATS c
  ON c.id=l.id_cats
GROUP BY p.id

所以基本上,这首先做一些连接来获取所有数据。如果您仅使用GROUP_CONCAT替换c.name行,您会看到每个product_id /类别对的一行。 GROUP BY告诉它根据产品ID对结果进行分组,然后GROUP_CONCAT(c.name..)告诉它采用组中出现的所有不同c.name值(因此对于每个产品ID,因为您按产品ID进行分组)并使用,作为分隔符将这些值连接成一个字符串。

因此,为了获得相同风格的每个类别的所有产品,它就像这样,

SELECT c.*, 
       GROUP_CONCAT(p.name SEPARATOR ',') as products
FROM CATS c
LEFT JOIN ZW-CAT-PRODUCT l
  ON l.id_cats=c.id
LEFT JOIN PRODUCT p
  ON p.id=l.id_product
GROUP BY c.id

编辑:要获取特定类别的产品行(根据评论中的要求),就是这样。

SELECT p.*
FROM PRODUCT p
LEFT JOIN ZW-CAT-PRODUCT l
  ON l.id_product=p.id
LEFT JOIN CATS c
  ON c.id=l.id_cats
WHERE c.name='xyz';

答案 1 :(得分:2)

如果您需要每个产品的逗号分隔类别列表,请查看MySQL的GROUP_CONCAT()聚合函数:

SELECT p.*, GROUP_CONCAT(c.name) AS categories
FROM PRODUCT p
LEFT JOIN ZW-CAT-PRODUCT cp ON p.id = cp.id_product
LEFT JOIN CATS c ON cp.id_cats = c.id
GROUP BY p.id

获取特定类别的所有产品(按类别ID):

SELECT p.*
FROM PRODUCT p
INNER JOIN ZW-CAT-PRODUCT cp ON p.id = cp.id_product
WHERE cp.id_cats = 42

相同,但按类别名称:

SELECT p.*
FROM PRODUCT p
INNER JOIN ZW-CAT-PRODUCT cp ON p.id = cp.id_product
INNER JOIN CATS c ON cp.id_cats = c.id
WHERE c.name = 'category1'

答案 2 :(得分:1)

你可以适应所有3对1查询是的,但考虑有3个huges表,我宁愿一个接一个地处理它们,而不是一次性完成整个批量处理。 这需要更长时间,但(在我看来)更加数据友好。