MySQL - 基于IN()返回多行

时间:2012-04-24 17:47:16

标签: php mysql sql left-join

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

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

我正在尝试获取一个返回第一列的表:videoTitle,第二列:productName。有没有办法根据逗号分隔列表离开连接?我希望结果表允许重复行,例如,如果两个产品列出了productVideoOrder中的一个视频,那么该表将有两行用于该视频,一个列出产品一,另一个列出产品二。

我可以澄清所需的一切。提前谢谢!

1 个答案:

答案 0 :(得分: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上的索引。