代码之家  ›  专栏  ›  技术社区  ›  Korty

静态SQL查询替换为动态列

  •  -3
  • Korty  · 技术社区  · 7 年前

    我有以下疑问:

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

    此查询使用SELECT in 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; "

    现在,我正在寻找一种解决方案,在不更改上述查询(SELECT in SELECT部分将是动态的)的情况下,将一个新行添加到tbl_标记中,以获取对 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 回复  |  直到 6 年前
        1
  •  1
  •   landru27    7 年前

    您对有关使用的问题的最后评论 JOIN 让我(我认为)更清楚地知道你在追求什么。 参加 在这里,s肯定会对您有很大帮助,取代您当前使用的相当繁琐的查询。

    试试这个:

    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);
    

    我认为这将使你更接近于一个通用的解决方案,它看起来像你正在努力实现的目标,或者至少为你指明了一个好的方向 参加 s

    我还认为,重新考虑数据库设计可能会让您受益匪浅,因为在查询输出中,这种将一个表中的行旋转为列的方式可以表明数据的结构可能更好。

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