有没有可能做这样的交叉陈述:
SELECT name FROM branchen WHERE id IN (SELECT value FROM metadata WHERE user_id=XX AND metakey = 'branche')
Result is:
Branche A
此结果只返回“branchen”的第一个值。 我会有一个这样的结果:
SELECT name FROM branchen WHERE id IN (1,2,3,4)
Result is:
Branche A
Branche B
Branche C
看来我必须将SELECT语句转换为字符串值?
SELECT value FROM metadata WHERE user_id=XX AND metakey = 'branche'
Result is:
1,2,3
是的,如果该值在表中保存为自己的值会更好。 我此刻不会改变结构,所以也许有人能帮我?
多谢!
问题是value
是字符串,而不是数字。 因为in
比较是一个数字,所以它被转换为一个数字。
真正的修复是修复数据模型,这样您就不会将数字存储在字符串中。 但假设您遇到了非常糟糕的数据模型,您可以使用find_in_set()
:
SELECT b.name
FROM branchen b
WHERE EXISTS (SELECT 1
FROM metadata md
WHERE md.metakey = 'branche' AND
find_in_set(b.id, md.value)
);
可以使用string_split
函数
declare @ids varchar (100);
SELECT @ids = value FROM metadata WHERE user_id=XX AND metakey = 'branche'
SELECT name FROM branchen WHERE id IN (select value from string_split(@ids, ','));
如果您使用mysql,那么您可以使用find_in_set。
string_split
-此方法在给定分隔符上拆分字符串。