2011-11-26 118 views
0

我可能錯過了一些東西,但我無法進行簡單的SQL查詢工作。 我有2張桌子城市和活動,我希望看到舉辦任何活動的所有城市。 下面的代碼似乎執行一些奇怪的事情,因爲它只是重載PHPMyAdmin。左連接問題

SELECT city.name, city.date, city.gh, city.ga 
FROM city 
LEFT JOIN event ON city.id = event.city 

當我嘗試自然連接時,它會顯示所有在任何城市託管的事件。

+2

嘗試'選擇ON city.id city.name,city.date,city.gh,city.ga 從市 INNER JOIN事件=事件。城市 GROUP BY city.name',我沒有MySql來檢查這個 – sll

+0

數據庫機器似乎正在工作就好像它將返回數十億行,但它不返回任何結果。 – user965748

+2

你可以分享你的表創建查詢嗎?因爲我認爲你可能會缺少一些指標。 – melihcelik

回答

1

你需要改變兩兩件事:

  • 使它成爲INNER加入(不使用LEFT關鍵字)
  • 使用DISTINCT關鍵字,否則您將獲得多次返回的同一城市(每次舉辦一次活動)

試試這個:

SELECT DISTINCT city.name, city.date, city.gh, city.ga 
FROM city 
JOIN event ON city.id = event.city 

你也可以做到這一點使用子選擇,像這樣:

SELECT city.name, city.date, city.gh, city.ga 
FROM city 
WHERE id in (SELECT city from EVENT) 

就個人而言,我覺得子選擇更容易理解 - 這幾乎是就像你用來描述問題的英文一樣。

1

如果您只想看看舉辦活動的城市,請使用INNER JOIN而不是LEFT JOIN。後者將顯示所有城市,無論是否舉辦了一場活動。

1

這就是你如何使用左連接來做到這一點,但我沒有看到這一點 - 只是使用內部連接並做一個獨特的。

SELECT distinct city.name, city.date, city.gh, city.ga 
FROM city 
LEFT JOIN event ON city.id = event.city 
where event.city is not null 

隨着內部聯接

SELECT distinct city.name, city.date, city.gh, city.ga 
FROM city 
JOIN event ON city.id = event.city 
1

你可能想要一個INNER JOIN

SELECT c.name, c.date, c.gh, c.ga 
FROM city AS c 
INNER JOIN event AS e ON c.id = e.city 

在這個圖形解釋看一看上JOINS,應該幫助你。

如果您只需要那些有事件不同城市的名字,你可以使用:

SELECT DISTINCT c.name 
FROM city AS c 
INNER JOIN event AS e ON c.id = e.city 
1
​​

的LEFT JOIN將返回從城市表中的所有項目甚至沒有進入事件關聯,輸出結果集將是非常大的,使用INNER JOIN你只要求它有一個關聯條目行,並通過這樣做GROUP通過每個城市選擇單行,您最終將得到一個唯一的城市列表,其中包含事件表中關聯的任何事件。

1

有很多方法可以在SQL中表達這一點,您應該進行配置文件以找出哪種方式最適合您的數據庫。

SELECT DISTINCT city.name, city.date, city.gh, city.ga 
    FROM city 
    INNER JOIN event ON event.city = city.id 

SELECT city.name, city.date, city.gh, city.ga 
    FROM city 
    INNER JOIN event ON event.city = city.id 
    GROUP BY city.name, city.date, city.gh, city.ga 

SELECT city.name, city.date, city.gh, city.ga 
    FROM city 
    INNER JOIN (
    SELECT DISTINCT event.city FROM event 
) AS eventcity ON eventcity.city = city.id 

SELECT city.name, city.date, city.gh, city.ga 
    FROM city 
    INNER JOIN (
    SELECT event.city FROM event GROUP BY event.city 
) AS eventcity ON eventcity.city = city.id 

SELECT city.name, city.date, city.gh, city.ga 
    FROM city 
    WHERE city.id IN (SELECT event.city FROM event) 

SELECT city.name, city.date, city.gh, city.ga 
    FROM city 
    WHERE EXISTS (SELECT city FROM event WHERE event.city = city.id)