假设我有两个表:
Table: customers
Fields: customer_id, first_name, last_name
Table: customer_cars
Fields: car_id, customer_id, car_brand, car_active
假设我正在尝试编写一个查询,以显示所有名字为“Karl”的客户以及他们拥有的**活跃**汽车的品牌。并非所有客户都会拥有一辆活跃的汽车。有些汽车处于事件状态,有些则处于非事件状态。
请记住,为了清楚和简单起见,这是我刚刚编造的一个代表性示例。请不要回答关于我们为什么要这样做的问题,我可以使用表别名,如何有一辆不活动的汽车,或者我的字段名称可以写得更好。这是一个假的例子,旨在非常简单地说明这一点。它具有我一直遇到的结构和问题。
这似乎最好用 LEFT JOIN 和子查询来完成。
SELECT
customer_id,
first_name,
last_name,
car_brand
FROM
customers
LEFT JOIN
(SELECT
customer_id,
car_brand
FROM
customer_cars
INNER JOIN customers ON customer_cars.customer_id = customers.customer_id
WHERE
first_name = 'Karl' AND
customer_cars.car_active = '1') car_query ON customers.customer_id = car_query.customer_id
WHERE
first_name = 'Karl'
结果可能是这样的:
first_name last_name car_brand
Karl Johnson Dodge
Karl Johnson Jeep
Karl Smith NULL
Karl Davis Chrysler
请注意两个 WHERE 子句中“Karl”的重复,以及与外部查询中同一个表的子查询中的 INNER JOIN。我对 mySQL 的理解是这个重复是必要的,因为它在处理外部查询之前先处理子查询。因此,必须适当限制子查询,使其不会扫描所有记录,然后尝试匹配结果记录。
我知道删除 car_active = '1' 条件会有所改变,但这是一项要求。
我想知道是否可以用一种不同的方式来完成这样的查询,这种方式只会导致条件和连接被输入一次。是否有推荐的方法首先确定外部查询的优先级,然后匹配内部查询?
我知道可以编写两个不同的查询(查找 Karl 的所有记录,然后执行另一个查找匹配汽车的查询)。但是,这会导致与数据库的多个连接(每个返回的记录一个连接)并且会非常费力且效率低下。
我也知道关联子查询,但根据我的理解和经验,这是为了在字段集中为每个客户返回一个字段(例如,一个聚合字段,如 Karl 花了多少钱)。我正在寻找与此类似的方法,但可以将一个客户与多个其他记录匹配,如上面的示例输出。
在您的回复中,如果您有推荐的查询结构来解决这个问题,那么如果您能写一个清晰的示例而不是仅仅描述它,那将非常有帮助。非常感谢您的宝贵时间!
最佳答案
首先,简单直接的查询还不够吗?
Say I am trying to write a query that shows all customers with a first name of "Karl," and the brands of the ** active ** cars they have. Not all customers will have an active car. Some cars are active, some are inactive.
按照这个要求,我可以做类似的事情:
SELECT C.first_name
, C.last_name
, CC.car_brand
FROM customers C
LEFT JOIN cutomer_cars CC ON CC.customer_id = C.customer_id
AND car_active = 1
WHERE C.first_name = 'Karl'
看看 SQL Fiddle sample .
关于mysql - 必须输入两次 mySQL 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49547470/