当一个用户的记录跨越多行时,我似乎无法掌握如何选择记录。
这是表的架构。
user_id key value
------------------------------------------
1 text this is sample text
1 text_status 0
2 text this is sample text
2 text_status 1
从上面的表/行中可以看到每个用户都有包含多行的信息。那么在这种情况下如何选择说“所有ID,text_status为”1“的文本值?
进一步复杂化,我需要这些帐户的电子邮件地址在另一张桌子上。如何编写1个select语句来提取电子邮件地址?我知道这有一个JOIN声明但对我来说有点复杂,尤其是我甚至无法弄清楚第一部分。
添加了注释我必须声明此表架构是Wordpress默认表wp_usermeta ..
答案 0 :(得分:1)
SELECT t1.*
FROM tbl t2
INNER JOIN tbl t1 ON t1.user_id = t2.user_id
AND t1.key = 'text'
WHERE t2.key = 'text_status'
AND t2.value = '1'
答案 1 :(得分:0)
我认为您错误地设置了表格。使text_status和值存在于同一行中。
现在的方式,您必须进行两次查询才能获得最终结果。在哪里,正确的方式只需要一个。
答案 2 :(得分:0)
这个任意键:值列表方案因其灵活性而具有吸引力。但它显然使查询复杂化。根据你的第二张桌子的结构,你可以逃脱:
SELECT key, value FROM user_table WHERE user_id=123
UNION ALL
SELECT 'email' as key, email as value FROM email_table WHERE user_id=123
但是这几乎只会返回一个列表,而不是一组字段。
答案 3 :(得分:0)
key
和value
看起来不对。 SQL已经为您提供了“键”(在列名中)和多个“值”(在每行中每列给出的值中)。
您的设计方式违反了数据库管理系统的工作方式,这导致了您的问题。阅读database normalization。
理想情况下,您的表格看起来像这样:
user_id text_status text
------------------------------------------
1 0 this is sample text
2 1 this is sample text
然后您的查询如下:
SELECT `user_id`, `text` FROM `table` WHERE `text_status` = '1';
正如你的桌子现在所示,你需要像(未经测试的):
SELECT `table`.*
FROM `table` LEFT JOIN
(SELECT `user_id`
FROM `table`
WHERE `key` = "text_status"
AND `value` = "1"
) AS `_` USING(`user_id`)
WHERE `table`.`key` = "text"