0

我正在寻找通过变量动态选择不同列名的查询。

假设我有包含我想选择的“动态列”,如下所示:

SELECT `ObjectID`,`ObjectLabel` FROM `modules_forms_objects`
+----------+----------------+
| 对象 ID | 对象标签 |
+----------+----------------+
| 71 | 加入日期 |
| 72 | 活跃 |
+----------+----------------+

现在,我又多了一张表,它是由上面的“ObjectID”调用的列。这里:

SELECT `data_id`,`71`,`72` FROM `7`
+---------+---------+------+
| 数据ID | 71 | 72 |
+---------+---------+------+
| 1 | 0000-00-00 00:00:00 | 空 |
+---------+---------+------+

我想将“值”列加入第一个表,这将包含第二个表中匹配列的值。(例如:对于 ObjectID #72,该值将为 NULL)。

最终,我希望我的结果是这样的:

+----------+----------------+--------------------+
| 对象 ID | 对象标签 | 价值 |
+----------+----------------+--------------------+
| 71 | 加入日期 |0000-00-00 00:00:00 |
| 72 | 活跃 | 空 |
+----------+----------------+--------------------+

当我使用传统的“JOIN”时,我得到了每一行的所有列,看起来有点重。

有任何想法吗?非常感谢!

4

3 回答 3

1

USESHOW COLUMNS FROM tab_name和使用 FIELD 属性来获取对应的列。

于 2013-08-25T18:57:05.650 回答
1

基本静态查询可能如下所示

SELECT m.ObjectID, m.ObjectLabel, q.Value
  FROM modules_forms_objects m LEFT JOIN
(
  SELECT objectid,
         CASE objectid 
            WHEN 71 THEN `71`
            WHEN 72 THEN `72`
         END value
    FROM `7` t CROSS JOIN
  (
    SELECT 71 objectid UNION ALL
    SELECT 72 
  ) c
) q 
    ON m.objectid = q.objectid

这个想法是首先取消您的7表格,然后将其外部加入modules_forms_objects

输出:

| 对象ID | 对象标签 | 价值 |
-----------|-------------|---------|
| 71 | 加入日期 | 0000-00-00 00:00:00 |
| 72 | 活跃 | (空) |

这是SQLFiddle演示

如果表中没有几十个列,7我建议坚持使用静态查询。


现在与动态 SQL 相同

SET @sql = NULL, @sql1 = NULL, @sql2 = NULL;

SELECT GROUP_CONCAT(
           CONCAT('WHEN ''',  column_name, ''' THEN `', column_name, '`')
       SEPARATOR ' ')
  INTO @sql1
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE table_schema = SCHEMA()
   AND table_name = '7'
   AND column_name LIKE '7%'
 GROUP BY table_name;

SELECT GROUP_CONCAT(
           CONCAT('SELECT ''',  column_name, ''' objectid' )
       SEPARATOR ' UNION ALL ')
  INTO @sql2
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE table_schema = SCHEMA()
   AND table_name = '7'
   AND column_name LIKE '7%'
 GROUP BY table_name;

SET @sql = CONCAT(
'SELECT m.ObjectID, m.ObjectLabel, q.Value
  FROM modules_forms_objects m LEFT JOIN
(
  SELECT objectid,
         CASE objectid ', @sql1, ' END value 
    FROM `7` t CROSS JOIN
  (', @sql2, '
  ) c
) q
    ON m.objectid = q.objectid');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这是SQLFiddle演示

于 2013-08-25T19:11:56.727 回答
0

这将给出特定表中的所有列名

SELECT 
        GROUP_CONCAT(COLUMN_NAME)
FROM 
        INFORMATION_SCHEMA.COLUMNS
WHERE 
        table_name = 'mytable'
于 2013-08-25T19:09:21.280 回答