我有以下查询
SELECT * FROM (
(SELECT value FROM table_a WHERE link_id = (SELECT id FROM table_b WHERE col_id=1 and somefield='some_text')) as item1,
(SELECT value FROM table_a WHERE link_id = (SELECT id FROM table_c WHERE col_id=7 and somefield='some_other_text')) as item2,
(SELECT value FROM table_a WHERE link_id = (SELECT id FROM table_m WHERE col_id=121 and somefield='more_text')) as item3
)
如果所有内部选择都返回一切正常,但是如果其中一个内部选择没有返回某些内容,则整个查询不会返回任何内容。
有什么我可以添加到查询中,以便如果其中一个内部选择没有返回某些东西,那么在它的位置返回一个空字符串?
所以例如第一个查询可能返回value ='返回值a'第二个可能返回'值b'然后第三个将返回'',即一个空字符串,因为没有找到行。然后,这将返回包含3列的结果集 -
'returning value a' ,'value b',''
这个查询的重点是我想要一个从多个不同表中返回值的结果集。这些内部选择是基于参数从php动态创建的,因此它们可以是任意数量的不同选项。
如果可以更好地编写查询,我很乐意更改它,只要我得到一个带有每个内部选择的值的结果集,或者如果select没有返回任何内容则为空字符串
答案 0 :(得分:1)
你有没有试过这样的事情:
SELECT `table_b`.* FROM `table_b`
LEFT JOIN `table_a` ON (`table_b`.`id`=`table_a`.`link_id`)
WHERE `table_a`.`link_id` IN (1,2,3);
使用LEFT JOIN
table_b将返回值为null
的字段。
答案 1 :(得分:0)
好吧,您没有通过提供详细查询来帮助我们,但是根据您的代码,我可以提出这个问题:
SELECT DISTINCT ta1.colName item1, ta2.colName item2, ta3.colName item3
FROM table_a ta1
LEFT JOIN table_a ta2
ON ta2.link_id = (
SELECT id
FROM table_c
WHERE col_id = 7
AND somefield = 'some_other_text'
)
LEFT JOIN table_a ta3
ON ta3.link_id = (
SELECT id
FROM table_m
WHERE col_id = 121
AND somefield = 'more_text'
)
WHERE ta1.link_id = (
SELECT id
FROM table_b
WHERE col_id = 1
AND somefield = 'some_text'
)
如果您愿意,可以仅使用LEFT JOIN
执行此操作,但我在WHERE
子句中添加了不要浪费表查找。
向我询问你不理解的任何事情。
答案 2 :(得分:0)
嗯,也许这不是最优雅的解决方案,但它应该做的工作:
SELECT
item1.value,
item2.value,
item3.value
FROM
(
(SELECT value FROM table_a WHERE link_id = (SELECT id FROM table_b WHERE col_id=1 and somefield='some_text')) as item1
RIGHT JOIN (SELECT NULL) t1 ON TRUE
),
(
(SELECT value FROM table_a WHERE link_id = (SELECT id FROM table_c WHERE col_id=7 and somefield='some_other_text')) as item2
RIGHT JOIN (SELECT NULL) t2 ON TRUE
),
(
(SELECT id FROM table_m WHERE col_id=121 and somefield='more_text')) as item3
RIGHT JOIN (SELECT NULL) t3 ON TRUE
)