所以说这是一张桌子:
------------------------------------
|post_id|meta_tag|meta_value |
------------------------------------
|1 |address |123 Example Lane |
------------------------------------
|1 |name |John Doe |
------------------------------------
|1 |email |johndoe@gmail.com|
------------------------------------
|3 |foo |bar |
------------------------------------
基本上我要做的是,只有post_id
中的一个meta_tag
值中包含地址时才从meta_value
中选择*。然后,我希望能够为每个post_id
回显所有{{1}}。
希望这不会太混乱。感谢。
答案 0 :(得分:3)
获取帖子至少有一个地址标记的所有行:
select *
from t t1
where exists (select 1
from t t2
where t2.post_id = t1.post_id and t2.meta_tag = 'address'
);
如果你想要完全一个,有各种方法。遵循相同的逻辑:
select *
from t t1
where 1 = (select count(*)
from t t2
where t2.post_id = t.post_id and t2.meta_tag = 'address'
);
如果你真的只想要有一个地址标签的* post_id *:
select post_id
from t t1
group by post_id
having sum(t1.meta_tag = 'address') = 1;
(如果您要查找任何> 0
代码,请设置address
。)