SQL查询在内部联接到右表后从左表中选择不同的行

时间:2013-07-31 14:23:14

标签: mysql sql select database-design inner-join

我有两个MySQL表。这是第一个[产品](PRIMARY = id):

[id] | title | description

这是第二个[尺寸](PRIMARY = id& size):

[id] | [size]

size只能包含[1,2,3,4,5,6]的值。

我有一个具有大小值的PHP数组。我将它重塑为逗号分隔的值字符串,如下所示:

$size_list = implode(",", $sizes);

对于那些不熟悉PHP的人,上面的代码会生成一个这样的字符串:“1,4,5”,然后像这样查询数据库:

$query = "SELECT t1.id,t1.title,t1.description,t2.size FROM products t1 INNER JOIN sizes t2 ON t1.id=t2.id WHERE size IN(".$size_list .")";

但是此查询会复制尺寸表中每种尺寸的产品。 我想:

从产品表中返回记录,这些记录在尺寸表中至少有一个可用尺寸,没有重复

当然

希望变量中的这些尺寸显示给客户


例如:

产品:

1 | product1 | description1
2 | product2 | description2
3 | product3 | description3
4 | product4 | description4

尺寸:

1 | 1
1 | 2
1 | 4
1 | 5
2 | 1
2 | 5

鉴于$sizes_list="1,2",我想要的输出是:

1 | product1 | description1 | 1,2,4,5
2 | product2 | description2 | 1,5

1 个答案:

答案 0 :(得分:3)

您的查询应该是:

$query = "
    select t1.id, t1.title, t1.description, group_concat(t2.size SEPARATOR ",") as sizes
    from products as t1
       inner join sizes as t2 on t1.id=t2.id
    where t1.id in (select t3.id from sizes as t3 where t3.size in (".$size_list .")
    group by t1.id, t1.title, t1.description
"

一点解释。当您连接两个表时,您从表sizes获取表id中所有products的所有行,因此id = 1连接四个记录,id = 2连接两个记录。所以你必须将这些数字汇总成一条记录。