Как установить приоритет или условие в mysql


У меня есть структура таблицы примерно такая

+---+----------+-----------+--------------+
| id| customer | Address   | Address_type |
+---+----------+-----------+--------------+
|1  | 1        | Address 1 | 2            |
|2  | 2        | Address 2 | 2            |
|3  | 1        | Address 3 | 1            |
+---+----------+-----------+--------------+

В базе данных есть два типа Address_types. Я должен выбрать адрес, основываясь на следующих условиях

  1. Если адрес для костюмера Address_type = 1 присутствует, то отобразите этот адрес.
  2. Если Address_type = 1 отсутствует, а Address_type = 2 присутствует, то отобразите адрес Address_type = 2 для этого клиента.
  3. Если оба присутствуют для этого клиента, то отображается только адрес, где Address_type = 1

Я пробовал это по условию или, но он отображает запись, которая является первой в базе данных, так что есть способ в запросе mysql достичь этого только с одним запросом? то есть что-то вроде предоставления приоритета в или условие для извлечения только Address_type = 1 запись, когда оба Address_types(1 и 2) присутствуют в базе данных?

6   3  

6 ответов:

Другой вариант: получить минимум 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

Вы можете использовать

SELECT 
  yt1.*
FROM 
  your_table yt1 
  LEFT JOIN your_table yt2 ON ( yt2.customer = yt1.customer AND yt2.address_type < yt1.address_type )
WHERE 
  yt2.id IS NULL

Выходы:

| ID | CUSTOMER |   ADDRESS | ADDRESS_TYPE |
-----|----------|-----------|--------------|
|  1 |        1 | Address 1 |            2 |
|  2 |        3 | Address 2 |            2 |

SQLFIDDLE

SELECT
  customer,
  COALESCE(
    MAX(CASE WHEN Address_type=1 THEN Address END),
    MAX(CASE WHEN Address_type=2 THEN Address END)
  )
FROM
  tableName
GROUP BY
  customer

Пожалуйста, смотрите fiddleздесь .

SELECT id, customer, 
       IF(address_type=1, address, IF(address_type=2, address, null))
                  as address 
FROM customer_table
GROUP BY customer;

Что это делает, так это то, что тип адреса один, он использует этот адрес, если два, то адрес 2, иначе ничего.

Вы можете просто добавить заказ по Address_type ASC, это гарантирует, что любые записи со значением 1 для address_type появятся первыми. Я не могу сказать вам, насколько эффективна сортировка по сравнению с другими методами, но, на мой взгляд, ORDER BY-это самое простое решение.

Нет необходимости или пока вам нужен только адрес для одного клиента:

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

Это упорядочит все адреса по типу, начиная с 1 и возвращая только один адрес, если тип 1 недоступен, будет возвращен тип 2.