2017-07-03 3 views
1

私は別の日に発生する複数のイベントに関連するデータの数を取得しようとしているところに問題があります。イベントのSQLクエリを構築するのが難しい

私は飛行機の群れに従っているとしましょう。それぞれの飛行機は、特定の空港に拠点を置いている間、世界中の多くの飛行機を1日に見つけることができます。私は一日一回のスポッター毎の行と、スポーターのIDの列、日付、その日のスポットの数(彼はいつも彼ですか?)、個々の航空会社の数飛行機が所属していた航空会社の数、航空会社の数はいくつでしたか。だから、私はこのような結果を持っているしたいと思います。だから、

+-----------+------------+---------+----------+-----------+ 
|   |   | Planes |   | Airline | 
| SpotterID | Date  | spotted | Airlines | Countries | 
+-----------+------------+---------+----------+-----------+ 
|  1234 | 2017-04-15 |  28 |  11 |   4 | 
+-----------+------------+---------+----------+-----------+ 
|  1234 | 2017-04-16 |  65 |  19 |   7 | 
+-----------+------------+---------+----------+-----------+ 
|  5678 | 2017-04-22 |  39 |  14 |   6 | 
+-----------+------------+---------+----------+-----------+ 
|  6677 | 2017-04-28 |  74 |  29 |   9 | 
+-----------+------------+---------+----------+-----------+ 

、(MySQLの5.7.17を)私のテストテーブルです(私はインデックスのカップルを忘れている場合があります)、以下のスケッチとして。

平面スポッティングイベントテーブルが定義されているとおり

CREATE TABLE `SpottingEvents` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`SpotterID` int(11) NOT NULL, 
`SpotDateTime` datetime NOT NULL, 
`PlaneID` int(11) NOT NULL, 
`Notes` varchar(100) NOT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `indx_SpotterID_PlaneID_DateTime` (`SpotterID`,`PlaneID`,`SpotDateTime`), 
KEY `indx_SpotterID_DateTime` (`SpotterID`,`SpotDateTime`) USING BTREE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

プレーンテーブルが次のように定義される。

CREATE TABLE `Planes` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`PlaneID` int(11) NOT NULL, 
`PlaneTypeID` int(11) NOT NULL, 
`AirlineID` int(11) NOT NULL, 
`Notes` varchar(100) NOT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `indx_PlaneID_AirlineID` (`PlaneID`,`AirlineID`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

航空会社テーブルは次のように定義される。

CREATE TABLE `Airlines` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`AirlineID` int(11) NOT NULL, 
`AirlineName` varchar(100) NOT NULL, 
`CountryID` int(11) NOT NULL, 
`Notes` varchar(100) NOT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `indx_AirlineID` (`AirlineID`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

と国の表は次のように定義されます:

CREATE TABLE `Countries` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`CountryID` int(11) NOT NULL, 
`CountryName` varchar(100) NOT NULL, 
`Notes` varchar(100) NOT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `indx_CountryID` (`CountryID`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

私の問題は、最後の2つの列で、航空会社と国がカウントされます。

エラー Unknown column 'sev.planeID' in 'where clause' につながるが、私は何の専門家だから、私は意図した結果が届かない
select distinct sev.SpotDateTime, sev.SpotterID, count(*) as planes_count, 
(select count(*) from (select distinct cnt.CountryID 
    from Countries as cnt 
    inner join Airlines as aln on al.CountryID = cnt.CountryID 
    inner join Planes as pl on pl.AirlineID = aln.AirlineID 
    where pl.PlaneID = sev.PlaneID) as t1) as countries_count 
from SpottingEvents as sev 
# where sev.UserID = 1234 
group by SpotDateTime 
order by SpotDateTime 

:私は、次のようなこれを行うには、いくつかの方法を、試してみました。では、どのようにして目的の結果を達成できますか?

+1

試した質問を共有できますか? –

+0

ほぼですが、https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple -sql-query – Strawberry

+0

私の質問を編集して、エラーの原因となるサンプルクエリを表示しました... –

答えて

1

あなたはCOUNT(DISTINCT)を探しています。必要なテーブルを結合してから数えます。

select 
    se.spotterid, 
    date(se.spotdatetime) as spot_date, 
    count(*) as planes, 
    count(distinct p.airlineid) as airlines, 
    count(distinct a.countryid) as countries 
from spottingevents se 
join planes p on p.planeid = se.planeid 
join airlines a on a.airlineid = p.airlineid 
group by se.spotterid, date(se.spotdatetime) 
order by date(se.spotdatetime), se.spotterid; 
+0

Thorsten!私はこれを慎重に勉強しなければなりません。将来このようなことが必要になるでしょう。私は飛行機の飛行機ではなく、技術趣味のイベントを追っているイベントに参加することを言います。このような質問を投稿するためのガイドラインを教えてくれたStrawberryにも感謝します。 –

関連する問題