【问题标题】:mysql - make query returns empty string value instead of empty result set for nested querymysql - 使查询返回空字符串值而不是嵌套查询的空结果集
【发布时间】:2011-07-28 20:20:39
【问题描述】:

我有以下问题

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 = 'returning value a',第二个可能会返回 'value b',然后第三个会返回 '',即一个空字符串,因为没有找到任何行。这将返回一个包含 3 列的结果集 -

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

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

如果可以更好地编写查询,我很乐意更改它,只要我得到一个包含每个内部选择的值的结果集,或者如果选择没有返回任何内容,则为空字符串

【问题讨论】:

  • 您到底想达到什么目的,因为您的查询看起来很混乱!?没有多大意义,你已经知道id,来自table_b,你为什么又要从那里获取记录?
  • 然后为我们提供一个完整详细的点查询,以便我们可以了解您到底想要实现什么,并可能提供更好的方法来实现它。或者只是想出你想要的。您提供的查询没有多大意义,因为它可以用更简单的查询来完成。
  • 我已经重写了这个问题,希望这能更好地解释这个问题
  • 不过,您的问题并没有提供足够的代码让我们了解您想去哪里。您的查询还没有意义。你知道id,但是,你继续从另一个表中获取它。请提供来自您的应用程序的查询示例,但表名和列已更改,以致晦涩难懂。
  • 上面的查询是我正在运行的查询,其中包含表名和列更改。虽然我做了另一个修改,因为我不知道 id,但 where 子句应该是 col_id,我现在已经更改了。我想要的只是返回单行,其中来自内部选择的每个值都放在自己的列中,除非没有返回值,在这种情况下我只想要列中的空字符串。因此,例如,如果有 4 个内部选择,则将返回一行,其中有 4 列,每列都有一个值。如果有 10 个内部选择,则会有 10 个列,每个列都有一个值。

标签: mysql


【解决方案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 值的字段。

【讨论】:

  • 好的,我看到你对你的问题的评论有点太晚了。你试过用“mysql存储过程”吗?
  • 感谢您的回答,但我的查询比我在示例中输入的要复杂一些(我的错)。我试图简化它,但这样做消除了另一个问题,即 table_b 不仅仅是一个表,而是许多不同的表,所以不能像你建议的那样做一个连接。见我上面的评论。感谢您的帮助,如果您有任何其他建议,我很乐意看到他们
  • 我感觉你必须重新考虑你的问题并使用存储过程,或者只是用更好的方式解释你的问题! :D
【解决方案2】:

好吧,您提供详细查询并没有帮助我们帮助您,但是根据您的代码,这是我能想到的:

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 JOINs 执行此操作,但我在WHERE 子句中添加了不浪费表查找。

有什么不懂的可以问我

【讨论】:

    【解决方案3】:

    好吧,也许这不是最优雅的解决方案,但它应该可以完成工作:

    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
        )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2019-12-20
      • 2021-09-04
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多