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-其返回沒什麼
你嘗試DISTINCT獨特的記錄檢索? – Muse
是的,我做了,我試過了,但它仍然返回多行 –
@ChrisMccabe,您選擇的插槽,日期和類型標準似乎與問題中描述的標準無關。這些額外的標準? –