【问题标题】:SQL query to select distinct rows from left table after inner join to the right tableSQL查询在内部连接到右表后从左表中选择不同的行
【发布时间】:2013-08-01 03:15:58
【问题描述】:

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

[id] | title | description

这是第二个 [sizes](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 .")";

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

从 products 表中返回在 size 表中至少有一个可用尺码的记录,且不重复

当然

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


例如:

产品:

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

【问题讨论】:

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


    【解决方案1】:

    您的查询应该是这样的:

    $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 中获取所有行,以获取表 products 中的所有 id,因此 id = 1 加入了四个记录,id = 2 加入了两个记录。因此,您必须将这些数字汇总到一条记录中。

    【讨论】:

    • 天啊,我认为我没有提到的这个查询有问题。我认为it does not list all the sizes for the product. It does just the sizes that are in $size_list。我错了吗?
    • 等一下,我要检查一下
    • 您是否尝试从查询中删除where size IN(".$size_list .")
    • 如果我这样做,它将列出所有产品!需要通过$size_list 限制我们想要的记录,但我需要每个产品的所有可用尺寸
    • 因此,如果您给出 size = (1, 2) 您想获取存在大小为 1 或 2 的记录,但您想获取此记录的所有大小?
    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多