【问题标题】:How can I do this with MySQL?我怎样才能用 MySQL 做到这一点?
【发布时间】:2011-12-03 06:19:16
【问题描述】:

我使用的是 MySQL,有两个数据库表如下:

用户

id   username
--------------
1    Bill
2    Steve

对象

user_id   key   value
----------------------
1         A     X
1         B     Y
1         C     Z
2         A     S
2         C     T

产生以下结果需要什么查询?

username   A  B  C
-------------------
Bill       X  Y  Z
Steve      S     T

我已经用 INNER JOIN 尝试过这个,但最终有 5 行(每个对应的对象行一个)。

非常感谢任何帮助。

【问题讨论】:

标签: mysql sql


【解决方案1】:

如果事先知道'A''B''C',您可以这样做:

SELECT users.username,
       ( SELECT objects.value
           FROM objects
          WHERE objects.user_id = users.id
            AND objects.`key` = 'A'
       ) AS a,
       ( SELECT objects.value
           FROM objects
          WHERE objects.user_id = users.id
            AND objects.`key` = 'B'
       ) AS b,
       ( SELECT objects.value
           FROM objects
          WHERE objects.user_id = users.id
            AND objects.`key` = 'C'
       ) AS c
  FROM users
 ORDER
    BY users.username
;

【讨论】:

    【解决方案2】:
    select u.username
         , oA.value A
         , oB.value B
         , oC.value C
      from users u
    left
      join objects oA
        on u.id = oA.user_id
       and oA.key = 'A'
    left
      join objects oB
        on u.id = oB.user_id
       and oB.key = 'B'
    left
      join objects oC
        on u.id = oC.user_id
       and oC.key = 'C'
    

    【讨论】:

    • 这也需要@ruakh 警告:如果事先知道“A”、“B”和“C”
    • 效果很好,谢谢。它也比发布的子查询方法更快。
    【解决方案3】:

    也许这不是您要的查询,但这是我在您的情况下使用过的简洁明了的查询:

    select objects.*, matrix.*
    from 
            (select users.id, o.key
              from users, (select distinct key from objects) as o
            ) 
    as matrix left join objects on matrix.id = objects.user_id
                               and matrix.key = objets.key
    order by matrix.id, matrix.key
    

    此查询“填充”空白。因此,您可以使用两个嵌套的 foreach(或任何类似的)来使用结果集并绘制所需的表格。

    【讨论】:

      猜你喜欢
      • 2022-11-09
      • 1970-01-01
      • 2010-12-31
      • 2018-10-05
      • 2015-05-01
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多