1

望ましい結果:

最初に検出された真の SELECT 式の結果のみを返します。

説明:

したがって、3 つの異なる SELECT 式があります。

  1. SELECT * FROM テーブル WHERE column1 = 'sometext' AND column2='1'
  2. SELECT * FROM テーブル WHERE column1 = 'someothertext' AND column2='2'
  3. SELECT * FROM テーブル WHERE column1 = 'somethirdtext' AND column2='3'

1 からの結果が必要です。1 が NULL を返している場合は、選択番号 2 からの結果が必要です。選択番号 2 が NULL を返している場合は、選択番号 3 を使用したいと考えています。

true である各条件に対して複数の行が返されることを期待していることに注意してください-そして、SELECT 1) 2) または 3) のいずれかからの結果のみが必要です (この順序で)

1 つの SELECT 式からのみ結果を返すことが重要であるため、2. と 3. が何かを返すとしても、1. からの結果のみが必要です。

私が今持っているコードは、その予想されるロジックに従っていますが、以下のSELECTSのいくつかによって複数の行が返されると、エラーが発生します:

1242 - サブクエリが複数の行を返す

今のコード:

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 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

とにかく条件ごとに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')
);

- サブクエリは複数の行/列を返してはならないことに注意してください。

于 2013-09-26T12:36:12.200 に答える
-1

MySQL は私の毎日のデータベースではないので、私はこれをオフにするかもしれませんが、サブクエリで LIMIT 1 を使用することはできませんか?

于 2013-09-26T12:36:49.467 に答える