Php 使用mysql将表的列划分为不同的行
这是桌子:桌子1 我需要得出这样的结果:Php 使用mysql将表的列划分为不同的行,php,mysql,sql,codeigniter,Php,Mysql,Sql,Codeigniter,这是桌子:桌子1 我需要得出这样的结果: ID | text_elem_11 | text_elem_12 | text_elem_13 --------------------------------------------------- 1 | text1 | text2 | text3 | 2 | text4 | text5 | text6 | 3 | text7 |
ID | text_elem_11 | text_elem_12 | text_elem_13
---------------------------------------------------
1 | text1 | text2 | text3 |
2 | text4 | text5 | text6 |
3 | text7 | text8 | text9 |
4 | text10 | text11 | text12 |
5 | text13 | text14 | text15 |
6 | text16 | text17 | text18 |
正确的方法是什么?使用下面的查询,我只能得到一个包含第一列和第二列的表
SELECT table1.ID,
table1.id_elem,
elem_11.text AS text_elem_11
FROM table1
INNER JOIN table1 AS elem_11 ON
table1.id_activity = 1 AND
table1.id_elem = 11 AND
elem_11.id_elem = 11
这就是结果
id_activity | id_elem | text_elem_11 |
-----------------------------------------
1 | 11 | text1 |
1 | 11 | text4 |
1 | 11 | text7 |
我不知道如何添加其他两列,如果用一个查询就可以了。。。那么,有什么想法吗?您正在寻找的是选择或选择子查询 我已经消除了最初的想法,即MySQL确实支持从表中的其他表中选择列名称 不幸的是,尽管存在这样的支持,但它可能不是您想要的,因为子查询必须返回单个文本,而不是列名称列表 我在这里偶然发现了关于这个话题的另一个问题:-看看这样复杂的观点是否能帮你完成任务。否则,我建议您选择代码中的行,然后对它们进行迭代,创建一个新的集合,将行转换为列-如果您愿意,我可以向您发布一些代码想法,因为我记得我以前遇到过这个问题 编辑:我意识到我有点跳过了解决方案。即使选择也帮不了你!我们必须想得更深一点。有趣的问题
SELECT id_activity,
MAX(CASE WHEN id_elem = 11 THEN text END) text_elem_11,
MAX(CASE WHEN id_elem = 12 THEN text END) text_elem_12,
MAX(CASE WHEN id_elem = 13 THEN text END) text_elem_13
FROM TableName
GROUP BY id_activity
ORDER BY id_activity
输出
╔═════════════╦══════════════╦══════════════╦══════════════╗
║ ID_ACTIVITY ║ TEXT_ELEM_11 ║ TEXT_ELEM_12 ║ TEXT_ELEM_13 ║
╠═════════════╬══════════════╬══════════════╬══════════════╣
║ 1 ║ text1 ║ text2 ║ text3 ║
║ 2 ║ text4 ║ text5 ║ text6 ║
║ 3 ║ text7 ║ text8 ║ text9 ║
║ 4 ║ text10 ║ text11 ║ text12 ║
║ 5 ║ text13 ║ text14 ║ text15 ║
║ 6 ║ text16 ║ text17 ║ text18 ║
╚═════════════╩══════════════╩══════════════╩══════════════╝
如果id元素数量未知,则更倾向于使用动态sql
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
CONCAT('MAX(CASE WHEN id_elem = ',
id_elem,
' THEN text ELSE NULL END) AS ',
CONCAT('`text_elem_' , id_elem, '`')
)) INTO @sql
FROM TableName
ORDER BY id_elem;
SET @sql = CONCAT('SELECT id_activity, ', @sql, '
FROM TableName
GROUP BY id_activity
ORDER BY id_activity');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
考虑应用程序级别的数据显示问题。那样更灵活。
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
CONCAT('MAX(CASE WHEN id_elem = ',
id_elem,
' THEN text ELSE NULL END) AS ',
CONCAT('`text_elem_' , id_elem, '`')
)) INTO @sql
FROM TableName
ORDER BY id_elem;
SET @sql = CONCAT('SELECT id_activity, ', @sql, '
FROM TableName
GROUP BY id_activity
ORDER BY id_activity');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;