【问题标题】:How to convert rows to columns with case statement?如何使用case语句将行转换为列?
【发布时间】: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'
  • 首先是解决方案。非常感谢!

标签: mysql wordpress


【解决方案1】:

meat_value 必须在最大值内

但老实说,我不知道你为什么想要帽子,这个查询

CREATE TABLE wp_usermeta
    (`umeta_id` varchar(1), `user_id` varchar(1), `meta_key` varchar(10), `meta_value` varchar(7))
;
    
INSERT INTO wp_usermeta
    (`umeta_id`, `user_id`, `meta_key`, `meta_value`)
VALUES

    ('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', NULL)
;
CREATE TABLE wp_users
    (`ID` varchar(1), `user_email` varchar(24))
;
    
INSERT INTO wp_users
    (`ID`, `user_email`)
VALUES

    ('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' and meta_value = 'james' then meta_value end) first_name,
  max(case when meta_key = 'last_name' and meta_value = 'james' then meta_value end) last_name,
  max(case when meta_key = 'zip' and meta_value = 'james' 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_email;
用户 ID |名字 |姓氏 |邮政编码 |电子邮件 :-------- | :--------- | :-------- | :------------ | :------------------------ 1 |詹姆斯 | | | james.wilson@example.com 2 | | | | mason.burton@example.com 3 | | | | jackson.owen@example.com

db小提琴here

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 2022-01-01
    • 2020-01-24
    • 2019-03-04
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多