【问题标题】:MySQL - Return Multiple Rows based on IN ()MySQL - 根据 IN () 返回多行
【发布时间】:2012-04-24 17:47:16
【问题描述】:

在使用 MySQL 时,我有两张表 - 一张是视频,另一张是产品。 products 表中的每一行都有一个名为 productVideoOrder 的列,它是一个以逗号分隔的 videoID 列表(与 video 表相关),按用户放置它们的顺序排列。

如果关系在中间表中,我在下面描述的内容会更容易,但对于该项目的其他功能,逗号分隔的列表是有意义的。

我正在尝试获取一个返回第一列:videoTitle,第二列:productName 的表。有没有一种基于逗号分隔列表的左连接方式?我希望结果表允许重复行,例如,如果两个产品在 productVideoOrder 中列出了一个视频,则该表将有两行用于该视频,一个列出产品一个,另一个列出产品二。

我可以澄清任何需要的东西。提前致谢!

【问题讨论】:

    标签: php mysql sql left-join


    【解决方案1】:
    SELECT  p.name, v.title
    FROM    product p
    LEFT JOIN
            video v
    ON      FIND_IN_SET(v.id, p.productVideoOrder)
    

    这不会很快。

    如果您对可以分配给产品的视频数量有合理的限制,您可以尝试使用这个:

    SELECT  p.name, v.title
    FROM    product p
    CROSS JOIN
            (
            SELECT  1 AS n
            UNION ALL
            SELECT  2 AS n
            UNION ALL
            SELECT  3 AS n -- add more if needed
            )
    LEFT JOIN
            video v
    ON      v.id = SUBSTRING_INDEX(SUBSTRING_INDEX(productVideoOrder, ',', n), ',', -1)
            AND SUBSTRING_INDEX(SUBSTRING_INDEX(productVideoOrder, ',', n), ',', -1) <> SUBSTRING_INDEX(SUBSTRING_INDEX(productVideoOrder, ',', n - 1), ',', -1)
    

    这将使用v.id 上的索引。

    【讨论】:

    • 谢谢!我认为这会奏效。我也在考虑将这些数据移动到它自己的表中,因为我认为这样可以解决这个问题和其他一些问题。
    猜你喜欢
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2013-08-10
    • 2012-08-04
    • 1970-01-01
    • 2020-04-29
    • 2016-07-19
    • 2013-11-04
    相关资源
    最近更新 更多