【问题标题】:Combine multiple rows into one MySQL将多行合并为一个 MySQL
【发布时间】:2012-08-29 13:17:48
【问题描述】:

我需要一些帮助。我搜索了解决方案,但没有找到。

我有三张桌子:

langs
(int) id | (varchar) language
    1    |       English
    2    |        Latin
    3    |      Esperanto
   ...   |         ...

keys
(int) id | (varchar) keys
    1    |       dog
    2    |       cat
   ...   |       ...

value
(int) id | (int) key_id | (int) lang_id | (varchar) value
    1    |       1      |        1      |        Dog
    2    |       1      |        2      |       Canis
    3    |       2      |        1      |        Cat
    4    |       2      |        2      |       Felis
    5    |       2      |        3      |        Kato
   ...   |      ...     |       ...     |        ...

我想得到结果:

key_id |  keys  |  English  |  Latin  |  Esperanto  
   1   |  dog   |    Dog    |  Canis  |    NULL
   2   |  cat   |    Cat    |  Felis  |    Kato
  ...  |  ...   |    ...    |   ...   |    ...

合并具有相等key_id 的行。我知道我可以尝试使用多个 JOIN 来实现,但速度很慢,而且我必须知道不同 langs 的确切数量。

提前致谢。 :)

【问题讨论】:

标签: mysql


【解决方案1】:

您实际上是在查看数据透视表。是可行的,虽然代码有点麻烦。

一个来源:http://www.artfulsoftware.com/infotree/queries.php#78

最后,尽管大多数 mysql 解决方案都需要一些具有存储过程的魔法,或者......硬编码您返回的语言。

数据透视表是 mysql 不擅长的一个领域。

【讨论】:

    【解决方案2】:
    SELECT CONCAT(
      ' SELECT `value`.`key_id`,'
    ,        '`keys`.`keys`,'
    ,         GROUP_CONCAT(
               'GROUP_CONCAT(IF(`value`.`lang_id`=',id,',`value`.`value`,NULL))'
              ,   ' AS `', REPLACE(language, '`', '``'), '`'
              )
    , ' FROM `keys` JOIN `value` ON `value`.`key_id` = `keys`.`id`'
    , ' GROUP BY `value`.`key_id`'
    )
    INTO @sql
    FROM `langs`;
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    【讨论】:

    • 这正是我需要的,但有一个问题。当我通过 phpMyAdmin 在我的本地主机数据库上重现它时,我收到错误 #1243 - Unknown prepared statement handler (stmt) given to EXECUTE。当我选择 @sql 变量并运行它时,代码正在运行。我尝试使用其他准备好的语句,它们也在工作。我搜索了类似的问题,但找不到解决方案。
    • @erik1001:您是否在 PREPARE 语句中使用相同的语句处理程序?
    • 当然是同名了,但是无论如何我都要用单独的查询来做,一个构建stmt,一个执行它,因为CI不允许多个查询,所以一切正常.非常感谢,你有我的赞成票。 :)
    猜你喜欢
    • 2010-11-07
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    相关资源
    最近更新 更多