1

期望的结果:

仅返回第一个真正遇到的 SELECT 表达式的结果。

解释:

所以,我有三种不同的 SELECT 表达式:

  1. SELECT * FROM table WHERE column1 = 'sometext' AND column2='1'
  2. SELECT * FROM table WHERE column1 = 'someothertext' AND column2='2'
  3. SELECT * FROM table WHERE column1 = 'somethirdtext' AND column2='3'

我希望得到 1 的结果。如果 1. 返回 NULL,我想要选择编号 2 的结果。如果选择编号 2. 返回 NULL,我想使用选择编号 3。等等。

请注意,对于每个为真的条件,我期望返回多于一行 - 我只想要来自 SELECT 1) 2) 或 3) 的结果(按此顺序)

只从一个 SELECT 表达式返回结果很重要,所以即使 2. 和 3. 会返回一些东西,我也只想要来自 1 的结果。

我现在拥有的代码遵循预期的逻辑,但是当我有多个行被以下某些 SELECTS 返回时,它给了我错误:

1242 - 子查询返回多于 1 行

现在的代码:

SELECT  IFNULL( (SELECT * FROM table WHERE  column = 'sometext'), IFNULL( (SELECT *    FROM table WHERE  column = 'someothertext'), IFNULL( (SELECT * FROM table WHERE  column = 'somethirdtext'), 0 ) ) ) 
4

4 回答 4

1

我会稍微不同地处理这个问题,因为无论如何您只能在每个条件下返回一行,我将使用以下内容来限制完成的选择数量:

SELECT  *
FROM    table 
WHERE   column IN ('sometext', 'someothertext', 'somethirdtext')
ORDER BY CASE column 
            WHEN 'sometext' THEN 1
            WHEN 'someothertext' THEN 2
            WHEN 'somethirdtext' THEN 3
        END
LIMIT 1;

正如评论中所指出的,您也可以使用 FIELD 进行排序:

SELECT  *
FROM    table 
WHERE   column IN ('sometext', 'someothertext', 'somethirdtext')
ORDER BY FIELD(column, 'sometext', 'someothertext', 'somethirdtext')
LIMIT 1;

我认为您可以使用以下方法在每个条件下获得多行:

SELECT  T.*
FROM    Table T
        INNER JOIN
        (   SELECT  Column
            FROM    Table
            WHERE   column IN ('sometext', 'someothertext', 'somethirdtext')
            ORDER BY FIELD(column, 'sometext', 'someothertext', 'somethirdtext')
            LIMIT 1
        ) MinT
            ON MinT.Column = T.Column;

基本上子查询MinT和以前一样,按照匹配的条件排序。然后获取第一个匹配列的值并将整个表限制为该值。

SQL Fiddle 示例

于 2013-09-26T12:41:31.013 回答
1

您正在寻找COALESCE功能。

SELECT COALESCE(
    (SELECT col FROM t WHERE `column` = 'sometext'),
    (SELECT col FROM t WHERE `column` = 'someothertext'),
    (SELECT col FROM t WHERE `column` = 'somethirdtext')
);

- 请注意,子查询不应返回超过 1 行/列。

于 2013-09-26T12:36:12.200 回答
1
SELECT t.*
FROM 
      ( SELECT o.column1, o.column2
        FROM 
            ( SELECT 1 AS ord, 'sometext' AS column1, '1' AS column2 UNION ALL
              SELECT 2,        'someothertext',       '2' UNION ALL
              SELECT 3,        'somethirdtext',       '3'
            ) AS o
        WHERE EXISTS
              ( SELECT 1
                FROM table AS td 
                WHERE td.column1 = o.column1
                  AND td.column2 = o.column2
              )
        ORDER BY o.ord 
            LIMIT 1
      ) AS d
    JOIN
      table AS t
        ON  t.column1 = d.column1
        AND t.column2 = d.column2 ;
于 2013-09-26T13:27:00.597 回答
-1

MySQL 不是我的日常数据库,所以我可能对此不感兴趣,但你不能在你的子查询上使用 LIMIT 1 吗?

于 2013-09-26T12:36:49.467 回答