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

Mysql SQL查询,用于在内部联接到右表后从左表中选择不同的行,mysql,sql,select,database-design,inner-join,Mysql,Sql,Select,Database Design,Inner Join,我有两个MySQL表。这是第一个[产品](主=id): 这是第二个[尺寸](主要=id和尺寸): size只能具有[1,2,3,4,5,6]中的值 我有一个PHP数组,它有大小值。我将其重塑为逗号分隔的值字符串,如下所示: $size_list = implode(",", $sizes); $query = "SELECT t1.id,t1.title,t1.description,t2.size FROM products t1 INNER JOIN sizes t2 ON t1.id=t

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

这是第二个[尺寸](主要=id和尺寸):

size
只能具有
[1,2,3,4,5,6]
中的值

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

$size_list = implode(",", $sizes);
$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 .")";
对于不熟悉PHP的用户,上面的代码将生成如下字符串:“1,4,5”,然后像这样查询数据库:

$size_list = implode(",", $sizes);
$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 .")";
但此查询会复制sizes表中每个尺寸的产品。 我想:

从products表返回记录,这些记录在sizes表中至少有一个可用大小,没有重复的记录

当然

希望将变量中的大小显示给客户端


例如:

产品:

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

1 | 1
1 | 2
1 | 4
1 | 5
2 | 1
2 | 5
给定
$size\u list=“1,2”
,我想要的输出是:

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

您的查询应该如下所示:

$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
"

一点解释。当您连接两个表时,您将从表
中获得所有
id
的所有
size
行,因此id=1与四条记录连接,id=2与两条记录连接。因此,您必须将这些数字聚合到一个记录中。

您的查询应该如下所示:

$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
"

一点解释。当您连接两个表时,您将从表
中获得所有
id
的所有
size
行,因此id=1与四条记录连接,id=2与两条记录连接。因此,您必须将这些数字聚合到一个记录中。

OMG,我想我没有提到的这个查询有问题。我认为
没有列出产品的所有尺寸。它只处理$size\u列表中的大小
。我错了吗Roman?等一下,我必须检查您是否尝试从查询中删除
where size IN(“.$size\u list”)
?如果我这样做,它将列出所有产品!需要通过
$size\u list
限制我们想要的记录,但我需要每个产品的所有可用大小。因此,如果您给出大小=(1,2),您希望获取存在大小为1或2的记录,但您希望获取此记录的所有大小?天哪,我想这个查询有问题,我没有提到。我认为
没有列出产品的所有尺寸。它只处理$size\u列表中的大小
。我错了吗Roman?等一下,我必须检查您是否尝试从查询中删除
where size IN(“.$size\u list”)
?如果我这样做,它将列出所有产品!需要通过
$size\u list
限制我们想要的记录,但我需要每个产品的所有可用大小。因此,如果您给出大小=(1,2),您想获取存在大小为1或2的记录,但您想获取此记录的所有大小?