2016-10-06 3 views
1

私は立ち往生しており、あなたの助けが必要です(アドバイス)。私はPHP & MysQLを使用しています。私の問題は以下のとおりです。MySQL LEFT JOINテーブルまたはPHP結合配列

これは私が達成しようとしているものの簡略化されたバージョンです。私は2つのテーブルを持っています.1つは都市リストで、もう1つは出発です。これらの2つのテーブルを可能な限りLEFT JOINして、bus_departuresテーブルに接続されたレコードがなくても、すべての都市のリストを返したいと思います。

私はMySQLを使用してこれを行うことができますか、PHPで配列を組み合わせる必要があります。私はあなたの解決策を見たいと思います。ありがとうございました。

-------------------  
ID | CITY    
-------------------  
1 | London    
2 | Paris    
3 | New York   
4 | Rome    
5 | Zagreb    

Bus_Departures

------------------------------------------ 
ID | DATE   | CITY   | No. DEPARTURES 
------------------------------------------ 
1 | 2016-06-06 | 1    | 5 
2 | 2016-06-06 | 4    | 3 
3 | 2016-06-06 | 3    | 2 
4 | 2016-06-07 | 3    | 4 
5 | 2016-06-07 | 1    | 1 
6 | 2016-06-08 | 3    | 8 
7 | 2016-06-09 | 1    | 3 
8 | 2016-06-09 | 4    | 2 

SELECT

SELECT * FROM City LEFT JOIN Bus_Departures WHERE date = '2016-06-07' ORDER BY City ASC 

RETURNS

London  2016-06-07  1 
New York 2016-06-07  4 

は私が

London  2016-06-07  1 
New York 2016-06-07  4 
Paris  2016-06-07  - (no records at all) 
Rome  2016-06-07  - (no records for this day) 
Zagreb  2016-06-07  - (no records at all) 

ありがとうこれをユーザにECHOしたいと思います!

+2

誰でもデータ/表のコピーを貼り付けることが非常に困難になりました。 2つの別々のセクションとして並べる代わりに投稿してください。また、1(ロンドン)の代わりに番号を掲示します。ありがとうございます。 – e4c5

+1

左の結合は大丈夫ですが、あなたのWHERE文は、左の結合が実行された後、右側の表にあります。結果として、例えば、あなたが参加したパリのエントリは 'Paris NULL NULL'のようになり、' Rome 2016-06-06 3'と 'Rome 2016-06-09 2 '。 – Elijan9

+0

批評e4c5のおかげで、私は次回よりユーザーフレンドリーなテーブルを投稿しようとします!もう一度Elijan9に感謝します。 – kiflica

答えて

2

あなたは確かにあなたのユースケースのためLEFT JOINを行う必要があるが、あなたの現在の声明の中で、あなたのWHERE文はすでに結合されたテーブル上で実行されます。 WHERE句が使用される前に、すでに結合されたテーブルは次のようになりますので、右:

London   | 2016-06-06 | 5 
Rome    | 2016-06-06 | 3 
New York   | 2016-06-06 | 2 
New York   | 2016-06-07 | 4 
London   | 2016-06-07 | 1 
New York   | 2016-06-08 | 8 
London   | 2016-06-09 | 3 
Rome    | 2016-06-09 | 2 
Paris    | NULL  | NULL 
Zagreb   | NULL  | NULL 

今ではWHERE date = '2016-06-07'が必要なデータを返すために行っていないことは明らかです。

あなたはJOIN句であなたの日付要件を含める場合、それはしかし、たとえば、動作します:

------------------------------------------ 
ID | DATE   | CITY   | DEPARTURES 
------------------------------------------ 
4 | 2016-06-07 | 3    | 4 
5 | 2016-06-07 | 1    | 1 
:その場合は

SELECT * FROM City LEFT JOIN Bus_Departures 
    ON (City.ID = Bus_Departure.CITY AND Bus_Departure.date = '2016-06-07') 
    ORDER BY City ASC 

LEFT JOINは右側にこれだけを用いて実施されます

(これも速く実行されます)

結果に日付を含めたいので、完全なステートメントは次のようになります。

SELECT City.CITY, '2016-06-07', Bus_Departure.DEPARTURES 
    FROM City LEFT JOIN Bus_Departures 
    ON (City.ID = Bus_Departure.CITY AND Bus_Departure.date = '2016-06-07') 
    ORDER BY City.ID ASC 
+0

の場合、エリヤン9のお手伝いをしてくれてありがとうございました。これは私が必要としていたものであり、ステップバイステップで説明しました。ありがとうございました – kiflica

0

where句を実行すると、すべてのnull値を取り除く日付までに制限します。あなたの結果にまだそれらを表示したい場合は、クエリにnullチェックを含める必要があります。

select c.CITY, bd.DATE, bd.DEPARTURES from city c 
left join bus_departures as bd on bd.city = c.id 
where bd.DATE='2016-06-07' or bd.DATE is null; 
+0

出発日に入場していない都市(例えば、トピックスターターの例のローマ) – Elijan9

関連する問題