我需要有关 MySQL 查询的帮助。
我有 2 个表,一个名为 cars
,另一个名为 accessories
(这是虚构的)。
cars
表中的一辆汽车在表中载有一组配件。
汽车 table 看起来像这样。
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
如果用户指定了AC
、Turbo
、Cruise control
和CD
,那么第1和第2辆车应该显示,但不是第 3 个,因为它们没有勾选 DVD
。
结果不应显示任何未“勾选”的帖子。
我希望有人能帮我为这个操作构造一个查询。
最佳答案
首先,正如其他人所建议的那样,您应该有一张表用于汽车,一张用于配件,还有一张链接表列出每辆车有哪些配件。举个简单的例子,您可以像这样设置表格:
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)
);
要列出除AC
、Turbo
、Cruise control
和CD
之外没有其他配件的所有汽车,然后您可以使用 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
关于mysql - 选择在给定集合之外没有属性的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9571114/