如何联接2个MySQL表以确定联接的表是否匹配

如何联接2个MySQL表以确定联接的表是否匹配,mysql,left-join,Mysql,Left Join,我有两个国家/地区和预订 我想列出各国的每一行,并简单地指出是否有匹配的保留 在每种情况下: 预订将有1个匹配行,或 预订将有许多匹配行,或者 预订将没有匹配的行 因此,我想从加入中了解是否有与预订匹配的内容。没有别的了 这是我的查询语句: SELECT country.countryID, reservation.citizen FROM countries AS country LEFT JOIN ( SELECT reservationID FROM reservations

我有两个国家/地区和预订

我想列出各国的每一行,并简单地指出是否有匹配的保留

在每种情况下:

预订将有1个匹配行,或 预订将有许多匹配行,或者 预订将没有匹配的行 因此,我想从加入中了解是否有与预订匹配的内容。没有别的了

这是我的查询语句:

SELECT country.countryID, reservation.citizen
FROM countries AS country
LEFT JOIN (
  SELECT reservationID
  FROM reservations
  LIMIT 1
) AS reservation ON reservation.citizen = country.countryID
ORDER BY reservation.citizen
它因“on子句”中的未知列“reservation.citizen”而失败

结论:
联接无法解决问题。

问题在子选择中。请注意,您没有将“公民”字段包含在预订中

SELECT country.countryID, reservation.citizen
FROM countries AS country
LEFT JOIN (
  SELECT reservationID, citizen
  FROM reservations
  LIMIT 1
) AS reservation ON reservation.citizen = country.countryID
ORDER BY reservation.citizen
另一方面,为什么要进行子选择?为什么会有限制?只查询以下内容不是更好吗

SELECT 
    country.countryID, 
    count(reservation.reservationID)
FROM 
    countries AS country
    LEFT JOIN reservations AS reservation 
    ON country.countryID = reservation.citizen
GROUP BY
    country.countryID
HAVING 
    count(reservation.reservationID) > 0
ORDER BY 
    reservation.citizen
;

您对加入有问题,应该是这样的

LEFT JOIN reservations AS reservation ON reservation.citizen = country.countryID
ORDER BY reservation.citizen

或者最好使用左外部联接来获取与联接条件不匹配的行

 LEFT OUTER JOIN reservations AS reservation ON reservation.citizen = country.countryID
ORDER BY reservation.citizen

在FROM reservations中,您说表名为reservations,但在其他地方,您说表名为reservations。我认为您需要先解决这个问题,然后才能确定进一步的问题。AS保留不处理@user151841吗?哦,您是对的:POkay-这就是问题所在,然后-从保留限制1中选择reservationID将只返回一列的一个结果,称为reservationID。这就是为什么它说找不到reservation.citizen列。您还需要选择reservationID,citizen…好的,关闭@user151841。。谢谢让脚本不会失败,但它不会从reservations表返回任何值,我知道它应该这样做,但这不太管用。首先,我需要删除GROUPBY和必须通过错误消息之间的逗号分隔符。接下来,脚本将永远运行,因为有245个国家记录和95000多个预订记录。我试图使用MySQL查询语句来简化这一点。我可以很容易地在PHP中运行第二个MySQL查询来进行查找,但我试图使其更加紧凑。最后,我需要返回所有245个国家/地区的行-这就是左连接的原因。但是这个解决方案只返回了79行,因此没有保留的国家/地区将被从结果列表中删除。如果您希望返回所有国家/地区,只需删除having,另一个解决方案是在subselect中进行计数并在afterwardsPerfect后加入,它可以在@user3159821处工作。唯一的问题是脚本运行很长时间,不会被使用。它确实精确地计算了匹配行的数量,但我只想知道是或不是-因此我尝试使用限制1来加速这个过程。看起来连接无法解决此问题,因此内联后续查找是一种可行的方法。感谢您的帮助。如果保留与国家/地区之间的关系为1:1,则您可以先在“按公民保留”中创建一个distinct或a group by,然后在“国家/地区”表中创建一个完整的外部联接。选择country.countryID reservation.has_reservation FROM country as country FULL OUTER JOIN选择DISTINCT citizen,1作为has_reservation FROM reservation as reservation ON country.countryID=reservation.citizen;GROUP BY中的性能将是一个问题。它运行良好,只是连接没有返回任何结果-我知道它应该是这样的。左侧外部连接a导致脚本运行很长时间,而b返回了接近4000行。应该只有246行,看来我的目标不能用连接来解决
 LEFT OUTER JOIN reservations AS reservation ON reservation.citizen = country.countryID
ORDER BY reservation.citizen