如何将mysql WHERE IN用于两个单独的表

时间:2017-02-15 16:23:07

标签: mysql where-in

我有两张桌子

books_tbl

blocks  side-bar   top-bar
 23,45   3,15      11,56

pages_tbl

id title
1  ff
3
11
15

我想选择pages_tbl中的行,其中页面ID包含books_table中的block,side-bar或tob-bar列。

如何处理?

2 个答案:

答案 0 :(得分:1)

您应该考虑修复表结构。永远不要在单个单元格中存储多个值。请参阅标准化。

在这种情况下,你不能尝试使用find_in_set函数。

select
from pages_tbl p
where exists (
    select 1
    from books_tbl b
    where find_in_set(
        p.id, 
        concat(b.blocks, ',', b.side_bar, ',', b.top_bar)
        ) > 0
);

请记住,此变慢,因为服务器无法使用索引。

答案 1 :(得分:1)

将逗号分隔值存储在单个字段中通常不是一个好主意。如果您真的无法更改数据结构,可以使用如下查询:

select p.id, p.title
from
  pages_tbl p inner join books_tbl b
  on (
    find_in_set(p.id, b.blocks)
    or find_in_set(p.id, b.side-bar)
    or find_in_set(p.id, b.top-bar)
  )
-- add where condition?
group by p.id, p.title