LEFT JOIN麻烦

时间:2011-11-26 22:16:07

标签: mysql sql join

我可能遗漏了一些东西,但我无法进行简单的SQL查询工作。 我有2个表城市和活动,我希望看到所有举办任何活动的城市。 下面的代码似乎执行了一些奇怪的事情,因为它只是重载了PHPMyAdmin。

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

当我尝试自然加入时,它会按预期显示在任何城市托管的所有事件。

6 个答案:

答案 0 :(得分:1)

如果您只想查看举办活动的城市,请使用INNER JOIN代替LEFT JOIN。后者将显示所有城市,无论是否举办了活动。

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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)

就个人而言,我发现子选择更容易理解 - 它几乎就像你用来描述问题的英语。

答案 4 :(得分:1)

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

LEFT JOIN将返回city表中的所有条目,即使没有关联事件条目,输出结果集也会非常大,使用INNER JOIN只请求具有关联条目的行,并通过GROUP BY选择单个每个城市的行,因此您最终会得到一个唯一城市列表,其中包含事件表中关联的任何事件。

答案 5 :(得分: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)
相关问题