mysql - make query为嵌套查询返回空字符串值而不是空结果集

时间:2011-07-28 10:01:38

标签: mysql

我有以下查询

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没有返回任何内容则为空字符串

3 个答案:

答案 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
    )