1

サブクエリを使用したクエリに頭を悩ませています。よろしければフォローしてください:

サンプルデータ:

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 年までのジープを所有している人々が所有する他の車が表示されないことです。

何かアドバイス?

4

3 に答える 3