【问题标题】:Trying to concatenate three different rows in mysql试图在mysql中连接三个不同的行
【发布时间】:2021-11-27 13:33:32
【问题描述】:

所以,我有一个属性表,我正在尝试构建一个查询以连接到一列

attributes
------------
id, c_id, key, value
1,  1,    'day', 11
2,  1,    'month', 09
3,  1,    'year', 1999
4,  2,    'day', 14
5,  2,    'month', 11
6,  2,    'year', 2004

这是我写的查询,

SELECT 
consumer_id,
CONCAT(
    (SELECT `value` FROM consumer_attributes WHERE `key` = 'select_day'),
    '_',
    CONCAT(
        (SELECT `value` FROM consumer_attributes WHERE `key` = 'select_month'),
        '_',
        CONCAT(
            (SELECT `value` FROM consumer_attributes WHERE `key` = 'select_year'),
            '',
            ''
        )
    )
) AS dob
FROM consumer_attributes 

扔出去

错误代码:1242 子查询返回多于 1 行

有人可以帮帮我吗?

我想要达到的输出

consumer_id, concat
1, 11_09_1999
2, 14_11_2004

【问题讨论】:

    标签: mysql concatenation


    【解决方案1】:

    另一种方法(如果您有大量数据,您可能希望对不同的答案进行计时);

    SELECT c_id, CONCAT(d.d, '_', m.m, '_', y.y) dob 
    FROM (select c_id, value d FROM consumer_attributes WHERE `key`='day') d 
    NATURAL JOIN (select c_id, value m FROM consumer_attributes WHERE `key`='month') m 
    NATURAL JOIN (select c_id, value y FROM consumer_attributes WHERE `key`='year') y;
    

    【讨论】:

      【解决方案2】:
      SELECT c_id, CONCAT_WS('_',
        (SELECT value FROM consumer_attributes a WHERE `key`='day' AND a.c_id = c.c_id),
        (SELECT value FROM consumer_attributes a WHERE `key`='month' AND a.c_id = c.c_id),
        (SELECT value FROM consumer_attributes a WHERE `key`='year' AND a.c_id = c.c_id)) AS dob
      FROM (SELECT DISTINCT c_id FROM consumer_attributes) c;
      

      https://www.db-fiddle.com/f/pB6b5xrgPKCivFWcpQHsyE/14

      【讨论】:

        【解决方案3】:

        注意:是 select_day 还是 day ?如果它不同,您应该在查询上方更改它。

        您没有将子查询与带有 id 列的主查询连接起来,因此它会为每条记录找到不止一行。其他都ok的话应该没问题:

            SELECT 
        dmy.consumer_id,
        concat (
        max(ifnull(    (SELECT `value` FROM consumer_attributes dd WHERE `key` = 'day' and dd.id = dmy.id) , -1)) ,'_' ,
        max(ifnull(        (SELECT `value` FROM consumer_attributes mm WHERE `key` = 'month' and mm.id = dmy.id)  , -1) ), '_' ,
        max(ifnull(            (SELECT `value` FROM consumer_attributes yy WHERE `key` = 'year' and yy.id = dmy.id) , -1)) )
        FROM consumer_attributes dmy
        group by dmy.consumer_id
        

        【讨论】:

          【解决方案4】:

          试试这个,

              SELECT `c_id`, CONCAT(GROUP_CONCAT(IF(`key` = 'day', `value`, NULL)),'_',GROUP_CONCAT(IF(`key` = 'month', `value`, NULL)),'_',GROUP_CONCAT(IF(`key` = 'year', `value`, NULL))) as dob
              FROM `consumer_attributes`
              GROUP BY `c_id`
          

          【讨论】:

          • 表中有很多其他属性,我需要指定键。
          猜你喜欢
          • 1970-01-01
          • 2017-03-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-16
          • 2014-02-24
          • 1970-01-01
          • 2011-10-15
          • 2016-08-25
          相关资源
          最近更新 更多