【问题标题】:Mysql subquery in where clause that returns comma separated value返回逗号分隔值的where子句中的Mysql子查询
【发布时间】:2020-12-13 18:55:29
【问题描述】:

我不太擅长子查询,这是我的示例表。

table customers
=====================
id  | name | order_ids
1   | John | 1,2


table orders
=====================
id  | name
1   | apple
2   | orange

我正在尝试使用此查询获取订单名称,但我只得到一个结果。我不确定这是否可能。

select o.name 
from orders o 
where o.id IN(
    select c.order_ids 
    from customers c 
    where c.id=1
)

【问题讨论】:

    标签: mysql sql csv subquery inner-join


    【解决方案1】:

    您的主要工作应该是修复您的设计。您不应该在字符串列中存储多个整数值。如果每个订单属于单个客户,则客户 ID 应存储在 orders 表中。如果一个订单可能同时属于多个客户,那么您需要一个桥接表,每个客户/订单元组有一行。

    也就是说:对于您当前的设计,您可以使用find_in_set()

    select o.*
    from orders o
    inner join customers c on find_in_set(o.id, c.order_ids)
    where c.id = 1
    

    【讨论】:

    • “你应该存储”还是“你不应该存储”?
    • 我同意数据库设计存在“缺陷”。但我暂时不要求更改我们的数据库设计。
    • @user3437905 你可能会发现FIND_IN_SET() 方法给出了正确的结果,但是它不能用索引进行优化。随着表中行数的增加(一如既往),它会变得越来越慢。您或您项目中的任何其他人可以做出决定,应尽快以标准化的方式重新设计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2019-08-23
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    相关资源
    最近更新 更多