【问题标题】:SELECT one row per COLUMN value每个 COLUMN 值选择一行
【发布时间】:2018-02-20 02:30:57
【问题描述】:

我有一张这样的桌子:

id  |  subscriber_id  |  var_name  |  var_value        | created
1   |  35             |  last_name |  Smith            | [TIMESTAMP]
2   |  35             |  city      |  New York         | [TIMESTAMP]
3   |  35             |  city      |  Boston           | [TIMESTAMP]

在这种情况下,假设var_value=Boston 所在行的时间戳比var_value=New York 行晚,因此我们将选择Boston 行。

我尝试过类似的方法,但它有时会说明非聚合列分组。

      SELECT
        var_name, var_value
      FROM
        subscriber_vars
      WHERE
        subscriber = ?
      GROUP BY subscriber
      ORDER BY
        created DESC

所以在这种情况下,预期的输出是:

[
    'last_name'  =>  'Smith'
    'city'       =>  'Boston'
]

【问题讨论】:

标签: mysql


【解决方案1】:

如果您以这种方式存储的数据量相当有限,并且列的索引正确,那么类似以下查询的内容应该可以工作:

select l.`last_name`, c.`city` from 
(SELECT subscriber_id, var_value as `city` FROM subscriber_vars WHERE var_name='city' ORDER BY created DESC LIMIT 1) c 
join 
(SELECT subscriber_id, var_value as `last_name` FROM subscriber_vars WHERE var_name='last_name' ORDER BY created DESC LIMIT 1) l USING(subscriber_id) 
where c.subscriber_id = 35;

返回的数据应该是这样的:

last_name |city
Smith     |Boston

【讨论】:

    【解决方案2】:

    使用GROUP BY

    SELECT * FROM (
        SELECT var_name, var_value FROM subscriber_vars ORDER BY created DESC
    ) x
    GROUP BY var_name
    

    GROUP BY 只会选择给定结果集中第一个唯一出现的值,其顺序与结果行相同。

    因此,我们运行查询来获取和排序我们想要的信息 (SELECT var_name, var_value FROM subscriber_vars ORDER BY created DESC),然后对查询返回的结果运行 GROUP BY

    这现在为我们提供了一组行,按照我们想要的顺序,以及我们想要的列,其中只包含第一次出现的 var_name 值。

    现在,我们只需要将所有这些行都返回 SELECT 以返回它们,这就是 SELECT * FROM 部分的用途。

    注意事项

    查看此StackOverflow post 以进一步阅读。

    【讨论】:

    • 再次,我收到这样的错误:SELECT list is not in GROUP BY clause and contains nonaggregated column 'x.var_value' which is not functionally dependent on columns in GROUP BY clause
    • 在测试数据库中工作得非常好——这意味着你的 MySQL 配置可能有问题。尝试按照here的步骤操作。
    • 如果MySQL服务器SQL模式配置为ONLY_FULL_GROUP_BY,服务器会抛出...this is incompatible with sql_mode=only_full_group_by等SQL模式错误
    猜你喜欢
    • 1970-01-01
    • 2020-05-20
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多