3

私はこのようなテーブル構造を持っています

+---+----------+-----------+--------------+
| | id| 顧客 | 住所 | アドレスタイプ |
+---+----------+-----------+--------------+
|1 | 1 | アドレス 1 | 2 |
|2 | 2 | アドレス 2 | 2 |
|3 | 1 | アドレス 3 | 1 |
+---+----------+-----------+--------------+

データベースには 2 つの Address_types があります。次の条件に基づいて住所を選択する必要があります

  1. Address_type = 1 の顧客の住所が存在する場合は、その住所を表示します。
  2. Address_type = 1 が存在せず、Address_type = 2 が存在する場合、その顧客の Address_type = 2 住所を表示します。
  3. その顧客に両方が存在する場合は、Address_type = 1 の住所のみを表示します。

OR条件でこれを試しましたが、データベースの最初のレコードが表示されるので、mysqlクエリでこれを1つのクエリだけで達成する方法はありますか? つまり、両方の Address_types(1 と 2) がデータベースに存在する場合、OR 条件で優先して Address_type = 1 レコードのみをフェッチするようなものですか?

4

6 に答える 6

1

別のオプション:Address_Type各顧客の最小値を取得してから、それに参加します。

SELECT
  id,
  customer,
  Address,
  Address_Type
FROM custs
INNER JOIN (
  SELECT customer, MIN(Address_Type) AS MinType
  FROM custs
  GROUP BY customer
) AddType ON custs.Address_Type = AddType.MinType
于 2013-09-10T14:23:48.813 に答える
0

1 人の顧客の住所のみが必要な場合は、必要ありません。

SELECT Address FROM table WHERE customer=:customerid ORDER BY Address_type ASC LIMIT 1

これにより、すべてのアドレスがタイプ別に並べ替えられ、1 から始まり、1 つのアドレスのみが返されます。タイプ 1 が使用できない場合は、タイプ 2 が返されます。

于 2013-09-10T14:30:46.267 に答える
0

ORDER BY Address_type ASC を追加するだけで、address_type の値が 1 のレコードが最初に表示されるようになります。並べ替えと他の方法の効率を比較することはできませんが、私の意見では、ORDER BY が最も簡単な解決策です。

于 2013-09-10T14:20:41.080 に答える