如何在mysql中优先处理OR条件

时间:2013-09-10 14:10:25

标签: php mysql greatest-n-per-group

我有类似这样的表结构

+---+----------+-----------+--------------+
| 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
  4. 的地址

    我已经通过OR条件尝试了这个但是它显示了数据库中的第一个记录,所以在mysql查询中有办法只用一个查询来实现这个目的吗?即当数据库中存在Address_types(1和2)时,在OR条件中优先获取Address_type = 1记录的东西?

6 个答案:

答案 0 :(得分:2)

您可以使用

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

答案 1 :(得分: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

答案 2 :(得分:1)

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

请参阅小提琴here

答案 3 :(得分:0)

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

这样做是地址类型是一个,它使用那个地址,如果是两个,那么地址2,否则没有。

答案 4 :(得分:0)

您只需添加ORDER BY Address_type ASC,这将确保首先显示address_type值为1的所有记录。我无法告诉你排序效率与其他方法的比较,但在我看来,ORDER BY是最简单的解决方案。

答案 5 :(得分:0)

不需要或只要您只需要一位客户的地址:

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

这将按类型排序所有地址,从1开始并仅返回一个地址。如果类型1不可用,则将返回类型2。