我有以下查询:
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 |
+----+---------------+-----------+-----------+--------------+
获得想法或帮助会很棒。 谢谢
答案 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
指向正确的方向。
我还认为您可能会从重新考虑数据库设计中受益,因为这种将一个表中的行旋转到查询输出中的列中可以指示数据结构可能会有所不同。
无论如何,我希望这会有所帮助。