2011-11-04 49 views
0

我正在構建汽車預訂系統,我需要構建的查詢是顯示系統中所有汽車的查詢 - 但每輛汽車可以由2人預訂與此同時。返回帶有3個表連接的查詢 - 其中一個作爲外連接

我只想顯示尚未預訂或僅由一個人預訂的汽車。我希望能夠看到人的名字和姓氏,如果它是由一個人預訂的,所以其他人可以告訴他們將與誰一起駕車。

這是我的查詢,但迄今爲止其返回的第一條記錄多次

SELECT cars.*, people.first_name, people.last_name 
FROM 
    cars 
LEFT JOIN booking on cars.id = booking.car LEFT OUTER JOIN people ON booking.person_1 = people.id 
WHERE cars.id NOT IN 
(SELECT car 
FROM booking WHERE slot = 'morning_drive' AND dated = '2011-11-05' AND person_1 != '' AND person_2 != '') AND cars.type = '911' 

繼承人的三個表的結構

CREATE TABLE `cars` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(100) NOT NULL, 
    `description` text NOT NULL, 
    `large_img_url` varchar(250) NOT NULL, 
    `small_img_url` varchar(250) NOT NULL, 
    `nr` varchar(100) NOT NULL, 
    `license_plate` varchar(100) NOT NULL, 
    `exterior_color` varchar(100) NOT NULL, 
    `interior_color` varchar(100) NOT NULL, 
    `PDK` tinyint(1) NOT NULL, 
    `Manual` tinyint(1) NOT NULL, 
    `type` enum('911','vintage') NOT NULL, 
    `power` varchar(100) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=27 ; 



CREATE TABLE `booking` (
    `id` int(11) NOT NULL auto_increment, 
    `slot` enum('morning_drive','afternoon_loop','return_drive') NOT NULL, 
    `type` enum('911','vintage_911') NOT NULL, 
    `car` int(11) NOT NULL, 
    `person_1` int(11) default NULL, 
    `person_2` int(11) default NULL, 
    `dated` date NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=25 ; 


CREATE TABLE `people` (
    `id` int(11) NOT NULL auto_increment, 
    `first_name` varchar(50) NOT NULL, 
    `last_name` varchar(50) NOT NULL, 
    `organisation` varchar(100) NOT NULL, 
    `event_date` date NOT NULL, 
    `wave` varchar(20) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=454 ; 

所以,我怎麼能有我的查詢只返回一行每輛車基本上只顯示沒有(person_2)和no(person_1或person_2)的汽車,如果汽車確實有person_1-它將檢索該人first_name和last_name

更新

我已經想通了,主要選擇查詢返回的所有rows-我需要它僅限於SLOT =「morning_drive」和日期=「2011-11-05」所以它表明,如果一個人有訂車的那個時間段,而且它需要返回沒有用戶已預訂了該時隙

更新2

基礎上實現查詢的新要求,我已經添加了一個左外連接的汽車子查詢,而不是使用整個表格 -

SELECT cars.*, people.first_name, people.last_name 
FROM 
    cars 
LEFT OUTER JOIN (SELECT car, person_1 FROM booking WHERE slot = 'morning_drive' AND dated = '2011-11-05' AND booking.person_1 != '' AND booking.person_2 = '') bookings on cars.id = bookings.car LEFT JOIN people ON bookings.person_1 = people.id 
WHERE cars.id NOT IN 
    (SELECT car 
FROM booking WHERE slot = 'morning_drive' AND dated = '2011-11-05' AND person_1 != '' AND person_2 != '') 
AND cars.type = '911' 

這更接近我想要回來,但它不是加入了百姓餐桌first_names和last_names-其返回沒什麼

+0

你嘗試DISTINCT獨特的記錄檢索? – Muse

+0

是的,我做了,我試過了,但它仍然返回多行 –

+0

@ChrisMccabe,您選擇的插槽,日期和類型標準似乎與問題中描述的標準無關。這些額外的標準? –

回答

0

嘗試:

SELECT cars.*, people.first_name, people.last_name 
FROM cars 
JOIN booking on cars.id = booking.car 
JOIN people on booking.person_1 = people.id 
WHERE booking.slot = 'morning_drive'  AND 
     booking.dated = '2011-11-05'  AND 
     coalesce(booking.person_2,'') = '' AND 
     cars.type = '911' 
UNION 
SELECT cars.*, '' first_name, '' last_name 
FROM cars 
WHERE cars.type = '911' AND 
     NOT EXISTS 
     (SELECT NULL FROM booking 
     WHERE slot = 'morning_drive' AND 
       dated = '2011-11-05' AND 
       cars.id = bookings.car)