帮助PHP MYSQL Select语句

时间:2011-03-28 00:21:59

标签: php mysql

当一个用户的记录跨越多行时,我似乎无法掌握如何选择记录。

这是表的架构。

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 ..

4 个答案:

答案 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)

keyvalue看起来不对。 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"