【问题标题】:One table, need multiple values from different rows/tuples一张表,需要来自不同行/元组的多个值
【发布时间】:2010-06-17 00:30:47
【问题描述】:

我有如下表格:

'profile_values'
userID | fid     | value  
-------+---------+-------
1      | 3       | joe@gmail.com
1      | 45      | 203-234-2345
3      | 3       | jane@gmail.com
1      | 45      | 123-456-7890

还有:

'users'
userID | name       
-------+-------
1      | joe      
2      | jane     
3      | jake    

我想加入他们,并在一行中包含两个值,例如:

'profile_values'
userID | name  | email          | phone
-------+-------+----------------+--------------
1      | joe   | joe@gmail.com  | 203-234-2345
2      | jane  | jane@gmail.com | 123-456-7890

我已经解决了,但感觉很笨拙,我想知道是否有更好的方法来做到这一点。意味着更易读或更快(优化)或只是最佳实践的解决方案。

当前解决方案:选择多个表,多个条件语句:

SELECT u.userID AS memberid,
       u.name AS first_name, 
       pv1.value AS fname,
       pv2.value as lname
FROM  users AS u,
      profile_values AS pv1, 
      profile_values AS pv2,
WHERE u.userID = pv1.userID
  AND pv1.fid = 3
  AND u.userID = pv2.userID
  AND pv2.fid = 45;

感谢您的帮助!

【问题讨论】:

  • 第一个表的最后2行第一​​列应该有2吗?
  • 我只想合并一个用户表,该表在一行中包含与该用户相关的更多值。但是那些其他值存在于一个表的多行中。因此,将其与一行中的值组合到一个表中。 Drupal 模块用户配置文件在添加扩展用户配置文件值的功能时以这种方式工作。

标签: sql mysql drupal pivot


【解决方案1】:

这是一个典型的透视查询:

  SELECT u.userid,
         u.name,
         MAX(CASE WHEN pv.fid = 3 THEN pv.value ELSE NULL END) AS email,
         MAX(CASE WHEN pv.fid = 45 THEN pv.value ELSE NULL END) AS phone,
    FROM USERS u
    JOIN PROFILE_VALUES pv ON pv.userid = u.userid
GROUP BY u.userid, u.name

如果您想查看在PROFILE_VALUES 表中没有任何条目的用户,请在“JOIN”之前添加“LEFT”。

【讨论】:

  • 这只返回了我一行,而我的用户表实际上是 442 个元组大。也许我做错了什么......实际上它只是给了我用户表中的第一行与我的 profile_values 表中的值配对
  • @WmasterJ:其他 441 位用户在PROFILE_VALUES 表中有条目吗?我敢打赌他们不会 - 请参阅我关于在这种情况下使用 LEFT JOIN 的说明。
  • @Ponies:感谢您这么快回复。是的,他们确实有条目。在我运行的另一个包含在我的问题中的 SQL 中,我实际上只得到了 220 行,因为这些是唯一具有我正在寻找的值的行。我看到了 LEFT JOIN 评论,没有用。由于我在这里使用了一个示例,因此我的 sql 语句有点不同。但是如果你能在这个 SQL 中发现任何错误:piratepad.net/Io1HDPFHJi
  • @WmasterJ:啊,您需要指定 GROUP BY 子句 - 它需要包含所有执行聚合函数(IE:MAX)的列名在他们身上。
  • @WmasterJ:MySQL 支持非标准行为,允许您从 group by 中省略列。欲了解更多信息:dev.mysql.com/doc/refman/4.1/en/group-by-hidden-columns.html。今后,不要过于简化问题的细节。
【解决方案2】:

这不是我应该说的(@OMG Ponies),但我想在 MySQL 视图中使用它。对于可编辑的视图,您不能使用聚合函数和other constraints。所以我必须做的是使用与我在最初问题中描述的相同的 SQL 查询。

希望这对某人有所帮助,添加标签以创建视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多