mysql - 必须输入两次 mySQL 条件?

标签 mysql left-join

假设我有两个表:

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/

相关文章:

mysql - 如何在 MySQL 中返回数据透视表输出?

php - 使用 PDO 预准备语句插入时 MySQL 性能极差

php - 我应该使用代理键还是使用自然键?

mysql - 如何限制每个用户 ID 一行

sql - Access SQL LEFT JOIN 替代方案

c# - Entity Framework 左连接

php - Docker : Could not find any MySQL database drivers.(需要 MySQLi 或 PDO。)

MySQL Join 语句从数据库中的同一字段多次提取项目

sql - Redshift 左外连接忽略空值

jpa - CriteriaQuery 中的条件左连接