【发布时间】:2021-07-06 16:17:06
【问题描述】:
我正在访问 WordPress 数据库,我想在进行选择时将行转换为列。到目前为止有效,但我不知道如何指定条件。
表 wp_usermeta
| umeta_id | user_id | meta_key | meta_value |
| - | - | - | - |
| 1 | 1 | first_name | james |
| 2 | 1 | last_name | wilson |
| 3 | 1 | zip | 83902 |
| 4 | 2 | first_name | mason |
| 5 | 2 | last_name | burton |
| 6 | 2 | zip | 29483 |
| 7 | 3 | first_name | jackson |
| 8 | 3 | last_name | owen |
| 9 | 3 | zip | |
表 wp_users
| ID | user_email |
| - | - |
| 1 | james.wilson@example.com |
| 2 | mason.burton@example.com |
| 3 | jackson.owen@example.com |
select
user_id,
max(case when meta_key = 'first_name' then meta_value end) first_name,
max(case when meta_key = 'last_name' then meta_value end) last_name,
max(case when meta_key = 'zip' then meta_value end) postal_code,
user_email as email
from `wp_usermeta`
left join `wp_users` on `wp_usermeta`.`user_id` = `wp_users`.`ID`
group by `user_id`;
结果
| user_id | first_name | last_name | postal_code| email |
| - | - | - | - | - |
| 1 | james | wilson | 83902 | james.wilson@example.com |
| 2 | mason | burton | 29483 | mason.burton@example.com |
| 3 | jackson | owen | null | jackson.owen@example.com |
我需要这样的条件:
(case when meta_key = 'first_name' and meta_value = 'james' then 'good' else 'bad') test
错误代码:1055。SELECT 列表的表达式不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“wp_usermeta.meta_value”;这与 sql_mode=only_full_group_by 不兼容
max(case when meta_key = 'first_name' and meta_value = 'james' then 'good' else 'bad' end) test
总是返回“好”(最大值)。
【问题讨论】:
-
您的第二次尝试评估每一行的 case 表达式,并且由于一行将是好的(第 1 行),那么它的最大值将返回好,因为
good>bad。我认为您要查找的内容需要两个 case 表达式:CASE WHEN MAX(CASE WHEN meta_key = 'first_name' THEN meta_value END) = 'James' THEN 'good' ELSE 'bad' END- 或者您可能实际上想要过滤数据,在这种情况下,它将是 -HAVING MAX(CASE WHEN meta_key = 'first_name' THEN meta_value END) = 'James' -
首先是解决方案。非常感谢!