2011-07-28 21 views
1

设置为空字符串值,而不是空的结果我有以下查询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',第二个可能返回'value b',然后第三个返回'',即空字符串,因为没有找到行。那么这将返回一个结果与3列设置 -

'returning value a' ,'value b','' 

此查询的整点是,我想要一个结果集,它从一些目前存在的表的返回值。这些内部选择是根据参数从php动态创建的,因此它们将是任意数量的不同选项。

如果查询可以更好地写我很高兴,只要我得到来自各内选择或空字符串的值设置,如果选择不返回任何结果去改变它

+1

究竟是你想实现的,因为你的查询显得如此搞砸了!?从'table_b'中,你已经知道了id,没有什么意义,为什么你要从那里再次获取记录? – Shef

+0

然后向我们提供完整详细的点查询,以便我们可以了解到底要达到什么目的,并且可能提供更好的方法来实现。或者只是想出你想要的。您提供的查询没有太大意义,因为它可以用更简单的方法完成。 – Shef

+0

我已经重写了这个问题,希望能够更好地解释这个问题 – John

回答

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表-B将与null值返回领域。

+0

好的,我看到你对你的问题的评论有点晚了。你有没有尝试使用“MySQL存储过程”? – Marco

+0

感谢您的答案,但我的查询比我放入示例(我的错)更复杂一点。我试图简化它,但这样做除去了另一个问题,即table_b不只是一个表,而是一些不同的表,因此不能像你所建议的那样进行连接。看到我上面的评论。感谢您的帮助,如果您有任何其他建议,我会很高兴看到他们 – John

+1

我觉得你必须重新考虑一下你的问题,并使用存储过程或只是解释你的问题更好的方法! :d – Marco

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条款中添加了不要浪费表查找。

问我任何你不明白的东西。

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 
    )