静态SQL查询替换为动态列

时间:2018-10-16 19:11:33

标签: mysql sql

我有以下查询:

http://www.sqlfiddle.com/#!9/752e34/3

此查询在SELECT查询中使用SELECT。

SELECT a.*

  

,(SELECT s.value FROM tbl_scd AS s WHERE s.tag_id = 1 AND s.main_id = a.id ORDER BY s.date_time DESC LIMIT 1) AS title

     

,(SELECT s.value FROM tbl_scd AS s WHERE s.tag_id = 2 AND s.main_id = a.id ORDER BY s.date_time DESC LIMIT 1) AS alt

FROM tbl_main AS a WHERE 1;

现在,我正在寻找一种解决方案,以将新行添加到tbl_tag中,而无需更改上面的查询(SELECT部分​​中的SELECT将是动态的)以获取对tbl_tag的引用

要获取此信息:

+----+---------------+-----------+-----------+--------------+
| id |     date      |    title  |     alt   |   new_column |
+----+---------------+-----------+-----------+--------------+
|  1 |    2018-10-10 |   test1-1 |   test1-3 |   NULL       |
|  2 |    2018-10-11 |   test2-1 |   test2-1 |   NULL       |
+----+---------------+-----------+-----------+--------------+

获得想法或帮助会很棒。 谢谢

1 个答案:

答案 0 :(得分:1)

您对有关使用JOIN的问题的最后评论使我(我认为)更加清楚。 JOIN绝对会为您带来很多帮助,代替您当前正在使用的笨拙查询。

尝试一下:

SELECT
  tbl_main.date,
  tblA.value AS title,
  tblB.value AS alt
FROM
  tbl_main
  INNER JOIN (SELECT main_id, tag_id, value
                FROM tbl_scd
               INNER JOIN tbl_tag ON (tbl_scd.tag_id = tbl_tag.id)
               WHERE tbl_tag.name = 'title') tblA
  ON (tbl_main.id = tblA.main_id)
  INNER JOIN (SELECT main_id, tag_id, value
                FROM tbl_scd
               INNER JOIN tbl_tag ON (tbl_scd.tag_id = tbl_tag.id)
               WHERE tbl_tag.name = 'alt') tblB
   ON (tbl_main.id = tblB.main_id);

我认为,这将使您更接近于所要达到的目标的通用解决方案,或者至少可以通过使用JOIN指向正确的方向。

我还认为您可能会从重新考虑数据库设计中受益,因为这种将一个表中的行旋转到查询输出中的列中可以指示数据结构可能会有所不同。

无论如何,我希望这会有所帮助。