我在用子查询打包查询时遇到了麻烦。请跟随,如果你会:更高效的MySQL子查询?
示例数据:
CREATE TABLE users (
user_id INT(10) NOT NULL AUTO_INCREMENT,
username VARCHAR(64),
PRIMARY KEY (user_id)
);
CREATE TABLE cars {
car_id INT(10) NOT NULL AUTO_INCREMENT,
user_id INT(10),
caryear YEAR(4),
carmaker VARCHAR(32),
carmodel VARCHAR(32),
PRIMARY KEY (car_id, user_id)
FOREIGN KEY(`user_id`) references users(`user_id`)
) ENGINE=InnoDB;
INSERT INTO users (user_id, name) VALUES (1,'Bob'),(2,'John'),(3,'Sally');
INSERT INTO cars (user_id, caryear, carmaker, carmodel) VALUES
(1,'2004','Audi','A4'),
(1,'2006','Toyota','Camry'),
(1,'2014','Jeep','CJ'),
(2,'1998','Acura','CL'),
(2,'2014','Honda','Accord'),
(3,'2011','Jeep','Rubicon')
好了,所以如果我要得到用户和他们的汽车名单,我可以做这样的事情:
SELECT
user_id,
username,
(SELECT GROUP_CONCAT(CONCAT(CarYear,' ',CarMaker,' ',CarModel))
FROM cars
WHERE cars.user_id = users.user_id
) AS Cars
FROM users;
但是,如何获得拥有2004-2014吉普车的用户列表?
我已经想出了这一点,但我敢肯定有一个更优雅的方式:
SELECT
user_id,
username,
(SELECT GROUP_CONCAT(CONCAT(CarYear,' ',CarMaker,' ',CarModel))
FROM cars
WHERE cars.user_id = users.user_id
AND CarMaker = 'Jeep'
AND CarYear BETWEEN 2004 AND 2014
) AS Cars
FROM users
HAVING Cars is not null;
这个解决方案的问题是,它不显示其他车辆归拥有2004 - 2014年吉普车的人。
有什么建议吗?
注GROUP_CONCAT有1024个字节的限制。 。就像文档http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat中提到的很可能这是导致你的问题.. –