0

これには、次の列と値を持つテーブル名 item_data があります。

id | name |value | price | matching_item
1  | item1|  5   | 1500  | NULL
2  | item2|  6   | 1700  | NULL
3  | item3|  4   |  500  | item1
4  | item3|  8   | 2000  | NULL

選択クエリを使用しました:

SELECT * from `item_data` WHERE (value = 4) AND (price > 100);

次に、次のような結果が得られます。

id | name |  value | price | matching_item
3  | item3|    4   |   500 |    item1

しかし、次のような結果が得られるクエリが必要です。

id | name |  value | price | matching_item
3  | item3|    4   | 500   |    item1
1  | item1|    5   | 1500  |   NULL

ペアの結果が欲しい。

4

3 に答える 3

0

あなたの質問を本当に理解していなくても (もっとわかりやすくしてください)、見つかった結果の matching_item 列を name 列に結合し、その行を見つかった結果と共に返したいと思いますか?

その場合は、 UNION を使用して目的の結果を取得することを検討してください。

SELECT i.*
FROM Item_Data i
  LEFT JOIN Item_Data i2 on i.matching_item = i2.name
WHERE i.value = 4 and i.price > 100
UNION
SELECT i2.*
FROM Item_Data i
  INNER JOIN Item_Data i2 on i.matching_item = i2.name
WHERE i.value = 4 and i.price > 100

そしてフィドル

UNION を使用しない別のアプローチを次に示します。

SELECT i3.*
FROM Item_Data i
  LEFT JOIN Item_Data i2 on i.matching_item = i2.name
  LEFT JOIN Item_Data i3 on i3.id in (i.id, i2.id)
WHERE i.value = 4 and i.price > 100

そしてフィドル

于 2013-01-31T16:15:45.010 に答える
0

あなたはこれが欲しいようです:

select *
from item_data i
where exists (select *
              from item_data d
              WHERE 
              (
                value = 4 
                AND price > 100
                and i.id = d.id
              )
              or i.name = d.matching_item);

デモで SQL Fiddle を参照してください

結果を返します。

| ID |  NAME | VALUE | PRICE | MATCHING_ITEM |
----------------------------------------------
|  1 | item1 |     5 |  1500 |        (null) |
|  3 | item3 |     4 |   500 |         item1 |
于 2013-01-31T16:16:17.680 に答える