【问题标题】:Select Include all data after WHERE clause在 WHERE 子句之后选择包括所有数据
【发布时间】:2017-01-02 08:03:43
【问题描述】:

下午好,

假设我有两张桌子。一个是带有汽车属性的表格,第二个是带有汽车选项的表格。我加入这两个表,并想根据下面的查询选择具有低音炮的汽车。如果我想选择具有低音炮选项的汽车,但又想显示这辆车与低音炮一起具有的所有选项怎么办?选项。

我遇到的问题是,当我在 WHERE 子句中使用如下查询时,汽车选项中仅显示低音炮,但我需要显示所有汽车选项。此外,我需要使用 php 和 html 表单按汽车选项搜索,因此我无法更改 WHERE 子句中的 Car_Options.Name。任何想法如何做到这一点?

SELECT CarName,Adress,Price,Description,Car_Options.Name
FROM Cars JOIN Car_Options ON Car_Options.IdCar=CarName.IdCar
WHERE Car_Options.Name="Subwoofer"
GROUP BY CarName

【问题讨论】:

  • CarName.IdCar ??那是什么?
  • 如果您愿意,请考虑遵循以下简单的两步操作:1.如果您还没有这样做,请提供正确的 CREATE 和 INSERT 语句(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • 这是两个表相互连接的地方。是连接两张表的外键
  • 如果你有一张叫 carnane 的桌子,那就对了

标签: php mysql join where-clause


【解决方案1】:

您的表名不一致。但是你想要这样的东西:

SELECT Cars.*, Car_Options.*
FROM Cars
JOIN Car_Options ON Car_Options.IdCar = Car.IdCar
WHERE Car.IdCar IN (SELECT IdCar FROM Car_Options WHERE Name="Subwoofer")

括号内的子选择搜索带有低音炮的汽车。

【讨论】:

    【解决方案2】:
    SELECT
        CarName,
        Adress,
        Price,
        Description,
        GROUP_CONCAT(Car_Options) as AllOptions
    FROM Cars
    JOIN Car_Options ON Car_Options.IdCar = CarName.IdCar
    WHERE EXISTS (SELECT 1 FROM Car_Options CO WHERE CO.IdCar = CarName.IdCar AND CO.Name = "Subwoofer")
    GROUP BY CarName
    

    我们将 Cars 表与 Car_Options 表连接起来,然后删除没有与 Subwoofer 关联的行的行组。我们将 Car_Options 连接到一个字段中。

    编辑:正如Strawberry 所指出的,上述查询引用了不存在的CarName 表。我一直误读它是Cars.CarName。考虑到这一点,让我们假设一个名为 IdCar 的新列:

    SELECT
        IdCar,
        CarName,
        Adress,
        Price,
        Description,
        GROUP_CONCAT(Car_Options) as AllOptions
    FROM Cars
    JOIN Car_Options ON Car_Options.IdCar = Cars.IdCar
    WHERE EXISTS (SELECT 1 FROM Car_Options CO WHERE CO.IdCar = Cars.IdCar AND CO.Name = "Subwoofer")
    GROUP BY IdCar
    

    假设每个 CarName 都是不同的,具有不同的 IdCar。

    【讨论】:

    • 这假设(并非不合理)carname 列是唯一的。但是 carname 表仍然不存在,使这个查询变得毫无意义。
    • @Strawberry 哦哈.. 我什至没有注意到CarName.IdCar。我继续阅读它为Cars.CarName
    【解决方案3】:

    您可以加入选项表两次。像这样的:

    SELECT c.CarName, c.Adress, c.Price, c.Description, o.Name
    FROM Cars c
      JOIN Car_Options os ON Car_Options.IdCar = Cars.IdCar -- for filtering by Subwoofer
      JOIN Car_Options o ON Car_Options.IdCar = Cars.IdCar -- for full list of options
    WHERE os.Name = "Subwoofer"
    

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多