从一个表中获取行,如果它们的id是另一个表的序列化值



我想从一个表(people)中获取值,如果他们的id在另一个表(groups)的序列化数据中。

我有这一行包含序列化数据存储:

a:18 {
i:0;s:1:"7";
i:1;s:2:"13";
i:2;s:2:"14";
i:3;s:2:"16";
i:4;s:2:"28";
i:5;s:2:"42";
i:6;s:2:"46";
i:7;s:2:"79";
i:8;s:2:"81";
i:9;s:2:"94";
i:10;s:3:"149";
i:11;s:3:"219";
i:12;s:3:"234";
i:13;s:3:"264";
i:14;s:3:"266";
i:15;s:3:"270";
i:16;s:3:"273";
i:17;s:3:"285";
}

这里被转换成一个数组所以更容易看

array (
0 => '7',
1 => '13',
2 => '14',
3 => '16',
4 => '28',
5 => '42',
6 => '46',
7 => '79',
8 => '81',
9 => '94',
10 => '149',
11 => '219',
12 => '234',
13 => '264',
14 => '266',
15 => '270',
16 => '273',
17 => '285',
)

我有另一个表people,它有数千行,其中包含这些人(姓名,姓氏,邮件)的数据,从数组中可以看出,我想要获取id位于该组所在行(7,13,14,16,28,42,46,79,81,94,149,219,234,264,266,270,273和285)的行。

我能够在PHP工作与表组内的个别值很容易使用这个正则表达式代码

SELECT * FROM groups WHERE people REGEXP CONCAT('i:[0-9]{1,3};s:[0-9]{1,3}:.', ?, '.;')
/* Where ? is the specific id I want. */

假设我查询这个

SELECT * FROM groups WHERE people REGEXP 'i:[0-9]{1,3};s:[0-9]{1,3}:"7";'

这将获取表组中包含id为7的所有行。

现在,我需要的基本上是从我的表people中获取姓名和姓氏,但只有那些id在特定数据组中的人。我将写一些无效的代码,这样你就可以看到我的方法

SELECT name, surname
FROM people AS table1
IF id
IN (people REGEXP CONCAT('i:[0-9]{1,3};s:[0-9]{1,3}:.', table1.id, '.;')
FROM groups
WHERE id = 1)
你能帮我一下吗?我确定必须使用正则表达式,也许是case,但我没有这些经验。如果可能的话,我想在一个查询中获得所有内容。

你需要连接这些表。

SELECT p.name, p.surname
FROM people AS p
JOIN groups AS g ON g.people REGEXP CONCAT('i:[0-9]{1,3};s:[0-9]{1,3}:"', p.id, '";')
WHERE g.id = 1

最新更新