更高效的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年吉普车的人拥有的其他汽车。

有什么建议吗?

比尔·卡文(Bill Karwin)

要为拥有吉普车2004-2014的任何用户显示用户及其所有汽车的列表,请执行以下操作:

SELECT
  u.user_id,
  u.username,
  GROUP_CONCAT(CONCAT(c.CarYear,' ',c.CarMaker,' ',c.CarModel)) AS Cars
FROM users u
INNER JOIN cars c USING (user_id)
INNER JOIN (
  SELECT DISTINCT user_id FROM cars
  WHERE c.CarMaker = 'Jeep' 
    AND c.CarYear BETWEEN 2004 AND 2014) AS j USING (user_id)
GROUP BY u.user_id, u.username;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章