0

1 つの列の値に基づいて特定の列を選択したいと考えています。

現在、特定の列の値を取得し、それを使用して別のクエリを作成しています。このような:

SELECT service_type FROM agreements WHERE id = 1;

値を PHP 変数に渡し、その結果に基づいて別のクエリを作成します。

サンプルコード:

if (service == 'internet')
SELECT ipreq, latency, ... FROM agreements WHERE id = 3 AND service_type = 'internet';
else
SELECT rates, markup, ... FROM agreements WHERE id = 3 AND service_type = 'vpn';

複数のクエリを作成せずにこれを行う方法はありますか?

PS

一部の列は別のテーブルから取得されます。列の値に基づいて、特定のテーブルから特定の列を選択したいだけです (この場合は、service_type)

4

2 に答える 2

1

アプリケーションのその後の過程で結果列を同じように処理すると仮定すると、次のように使用できます。

SELECT * FROM
(
    select service, ipreq, latency, ... FROM agreements WHERE id = 3
    UNION ALL
    select service, rates, markup, ... FROM agreements WHERE id = 3
) tmp
WHERE service = 'internet'

これにより、可能なすべてのエントリの組み合わせが選択id = 3され、必要なものが選択されserviceます。

ただし、これはすべてのフィールドが同じタイプの場合にのみ機能します。

おそらく、フィールドの名前を変更して、フィールドへのアクセスを統一する必要があります。

SELECT * FROM
(
    select service, ipreq as field1, latency as field2, ... FROM agreements WHERE id = 3
    UNION ALL
    select service, rates as field1, markup as field2, ... FROM agreements WHERE id = 3
) tmp
WHERE service = 'internet'

それをしたくない場合は、アプリケーションの列インデックスでそれらにアクセスする必要があります。それでも、フィールド タイプは同じである必要があります。

編集:

更新されたコードは次のとおりです。

SELECT * FROM
(
     SELECT doc.id as docid, service, ipreq, latency,... FROM agreements WHERE service = 1
     UNION ALL
     SELECT doc.id as docid, service, rates, markup,... FROM agreements WHERE service = 2
) as tmp
WHERE docid = 1

このコードは、特定のサービス タイプに関連するすべてのフィールドを選択します。

于 2013-06-12T14:52:11.403 に答える
0

Mysql は、クエリ内で IF/ELSE を構築できる制御フロー構文をサポートしています。If/Else ステートメント内でサブクエリを使用して、非常に動的な select ステートメントを作成することもできます。

于 2013-06-12T14:50:52.047 に答える