2013-04-24 57 views
0

我有我的SQL DB和使用PHP来访问它。mySQL查询与联接和计数

我的表是这样的:

航班表航班号,时间,机场

座位表 航班号,座位号

我有以下查询:

SELECT f.FlightID 'ID', Count(*) 'Seats Booked' FROM flights f, seats s GROUP BY f.FlightID 

我想要输出要预订

ID民席书

航班号座位

的问题是目前它显示了这一点:

[{"ID":"0","Seats Booked":"37"},{"ID":"1234","Seats Booked":"37"}] (The output is JSON encoded) 

当它应该是像10和27如果你跟着我?它似乎不正确的连接。

请给出一个解释我做错了什么,而不仅仅是一个答案。

谢谢!

+1

建议:请不要在名称中使用空格。 – 2013-04-24 18:27:02

回答

3

LMC,

您没有使用该条款,使加盟。这就是为什么你得到每个分组指令的总和。

使用你的语法应该是这样的正确的指令:

SELECT f.FlightID 'ID', Count(*) 'Seats Booked' 
FROM flights f, seats s 
where s.FlightId = f.FlightId 
GROUP BY f.FlightID 

使用内部联接语法应该是这样的:

SELECT f.FlightID 'ID', Count(*) 'Seats Booked' 
FROM flights f 
inner join seats s 
on s.FlightId = f.FlightId 
GROUP BY f.FlightID 

你可以做的事情,而无需使用飞行表。飞行表没有任何区别,因为你正在返回一组飞行体。桌上的座位已经飞过了。以下声明应该足够了。如果你不关心不航班预订座位

SELECT s.FlightID 'ID', Count(*) 'Seats Booked' 
FROM seats s 
GROUP BY s.FlightID 

如果没有预订座位,你想展示飞行,那么你应该使用左连接到航班这是真实的。以下声明将解决此问题。

SELECT f.FlightID 'ID', Count(*) 'Seats Booked' 
FROM flights f 
left join seats s 
on s.FlightId = f.FlightId 
GROUP BY f.FlightID 
+0

为什么这比内部查询更好?哪种瓶胚更好? – LmC 2013-04-24 18:08:31

+0

我编辑了我的帖子。看看最后的声明。您不需要加入只检索预订的航班和座位数 – 2013-04-24 18:12:27

+0

@JoseAreas如果他想从* all *航班预订座位,那么他会希望JOIN确保只有在航班ID存在的情况下才能预订座位在航班表 – 2013-04-24 18:15:27

1

首先,您应该使用下面显示的连接语法,因为您的语法有点过时。 其次,一定要包括where条款

SELECT f.FlightID 'ID', count(*) as "seat count" 
INNER JOIN seats s On 
f.FlightID = s.FlightID 
Where f.FlightID = 'some_id' 
GROUP BY f.FlightID 
+0

啊我现在明白了,所以它需要一个内部查询?为什么是这样?没有一个可以做到吗?很好的答案! – LmC 2013-04-24 18:01:33

+0

@LmC如果您不使用子查询,count将只选择* entire *查询返回的总行数,并将其用于每行。 – 2013-04-24 18:02:31

+0

那么这是做到这一点的最佳方式? – LmC 2013-04-24 18:04:47

1

这里跟你的做法是,你不参加你的表的问题。我加入的意思是“表1”与“表2”有一些关系。在你的情况下,它是航班编号。因此,在另一张表(座位表)中,您将拥有座位数据,但是可用于任何特定的航班。因此,为了获得相匹配的记录,您需要根据飞行体加入两张表,以便为每次飞行获得不同数量的座位。

试试这个sql。

select f.flightid as 'id', count(s.seat_number) as seats_booked 
from flight f, seats s 
where f.flightid=s.flightid 
group by f.flightid 
+0

为什么这比内部查询更好?哪种瓶胚更好? – LmC 2013-04-24 18:09:02

+1

它既不好也不差。这只是一种替代语法,与内部连接完全相同 – 2013-04-24 18:10:25

+0

@LmC:在任何sql语句中,执行从底部开始,最后选择行。所以在你的解决方案中,当选择发生时另一个sql正在执行。所以需要更多时间来执行。应该避免这种做法。 – ankurtr 2013-04-24 18:10:42

2

如果你不需要什么比航班号从多个航班表,为什么不这样做:

SELECT s.FlightID,COUNT(s.id)FROM席氏集团BY s.FlightID

如果您还需要计算有没有座位的航班,使用此:

SELECT f.flightID,COUNT(S。 ID)FROM航班f LEFT JOIN座位s ON s.flightID = f.flightID GROUP BY f.flightID

+0

因为加入会从航班表中航班ID存在的座位表中选择所有座位。 – 2013-04-24 18:16:03

+0

你是对的。如果需要零座位,那么当然只能使用连接。但内部连接不是一个解决方案,无论如何 – 2013-04-24 18:17:40

+0

我更新了我的答案。这里应该使用LEFT JOIN来考虑有0个座位的航班 – 2013-04-24 18:21:29