【问题标题】:Select items with no attributes outside a given set选择在给定集合之外没有属性的项目
【发布时间】:2012-03-06 02:18:52
【问题描述】:

我需要有关 MySQL 查询的帮助。 我有两张桌子,一张叫cars,一张叫accessories(这是虚构的)。

cars 表中的汽车在表中带有一组配件。 车桌长这样。

ID
Name
Accessory 1
Accessory 2
Accessory 3
Accessory 4
Accessory 5
etc..

然后我希望用户使用复选框指定他想要的配件。 然后运行查询以显示来自cars 的各种汽车那些配件或更少

示例:

ID = 1
Name = Ford Mondeo
Accessory 1 = AC
Accessory 2 = Turbo

ID = 2
Name = Ford Mondeo SE
Accessory 1 = AC
Accessory 2 = Turbo
Accessory 3 = Cruise control
Accessory 4 = CD

ID = 3
Name = Ford Mustang
Accessory 1 = AC
Accessory 2 = Turbo
Accessory 3 = Cruise control
Accessory 4 = CD
Accessory 5 = DVD

如果用户指定了ACTurboCruise controlCD,则应该显示第一和第二辆车,而不是第三辆车,因为它们没有勾选DVD

结果不应显示任何未“勾选”的帖子。

我希望有人可以帮助我为此操作构建查询。

【问题讨论】:

标签: mysql


【解决方案1】:

首先,正如其他人所建议的那样,您应该有一个用于汽车的表格,一个用于配件的表格,以及一个链接表格列出每辆汽车的配件。举个简单的例子,你可以像这样设置你的表:

CREATE TABLE cars (
  id INTEGER NOT NULL PRIMARY KEY,
  name VARCHAR(255) NOT NULL
);

CREATE TABLE accessories (
  id INTEGER NOT NULL PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  UNIQUE KEY (name)  /* for efficient lookups by name */
);

CREATE TABLE car_accessories (
  car INTEGER NOT NULL,
  accessory INTEGER NOT NULL,
  PRIMARY KEY (car, accessory),
  UNIQUE KEY (accessory, car)
);

要列出除ACTurboCruise controlCD 之外没有附件的所有汽车,然后可以使用 NOT EXISTS 子选择 (SQLize):

SELECT *
FROM cars AS c
WHERE NOT EXISTS
  ( SELECT * FROM car_accessories AS ca, accessories AS a
    WHERE ca.car = c.id
      AND ca.accessory = a.id
      AND a.name NOT IN ('AC', 'Turbo', 'Cruise control', 'CD') )

LEFT JOIN (SQLize):

SELECT c.*
FROM cars AS c
  LEFT JOIN 
    ( car_accessories AS ca
      JOIN accessories AS a
        ON ca.accessory = a.id
        AND a.name NOT IN ('AC', 'Turbo', 'Cruise control', 'CD')
    ) ON ca.car = c.id
WHERE ca.car IS NULL

【讨论】:

    【解决方案2】:

    改变你的架构,它需要规范化

    例如

    Cars, ID, AccessoryID
    
    Accessories, ID
    

    然后

    你的例子是这样的

    Accessories
    1, AC
    2, Turbo
    3, Cruise Control...
    

    汽车会说

    ID,Name 
    

    汽车配件

    CarID, AccessoryID
    

    在对该批次进行排序后,您想要一个 ALL 查询..

    【讨论】:

      猜你喜欢
      • 2016-10-10
      • 1970-01-01
      • 2013-10-20
      • 2016-08-01
      • 2020-12-13
      • 1970-01-01
      • 2018-04-22
      • 2018-02-22
      • 1970-01-01
      相关资源
      最近更新 更多