我有类似这样的表结构
+---+----------+-----------+--------------+ | id| customer | Address | Address_type | +---+----------+-----------+--------------+ |1 | 1 | Address 1 | 2 | |2 | 2 | Address 2 | 2 | |3 | 1 | Address 3 | 1 | +---+----------+-----------+--------------+
数据库中有两个Address_types。 我必须根据以下条件选择地址
我已经通过OR条件尝试了这个但是它显示了数据库中的第一个记录,所以在mysql查询中有办法只用一个查询来实现这个目的吗?即当数据库中存在Address_types(1和2)时,在OR条件中优先获取Address_type = 1记录的东西?
答案 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 |
答案 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。