【问题标题】:MySql Inner Join from 2 tables loosing some rows来自 2 个表的 MySql 内部联接丢失了一些行
【发布时间】:2021-02-18 11:04:40
【问题描述】:

我对查询和 sql 脚本的整个逻辑有疑问。

我的数据库有 2 个表。第一个“旅行”表有很多独特的旅行,有很多列。第二个表“赞”是每次旅行存在的赞以及该旅行所属国家/地区的名称

现在我想select * from trips order by likes where the country = "Greece".

首先我编写以下代码

SELECT T.*
FROM trips T INNER JOIN
     tripslikes L
     ON T.trip_id = L.trip_id
Where T.country_name = "Greece";

结果是 country = "Greece" 重复次数与此行程中获得的赞一样多的所有旅行。

问题是我的结果失去了迄今为止没有任何类似的旅行。这是因为ON T.trip_id = L.trip_id

知道如何在表上没有任何记录的情况下获得喜欢的旅行(意思是到目前为止没有任何喜欢记录的旅行)?

更新1

select *, count(*) Total
from 
(
  SELECT T.*
FROM trips T
INNER JOIN tripslikes L
ON T.trip_id = L.trip_id Where T.country_name = "Greece"

) d
group by trip_id;

非常感谢!

【问题讨论】:

  • 尝试将 INNER JOIN 替换为 LEFT JOIN
  • Left Join 不仅会返回前往希腊的旅行,还会返回来自所有国家/地区的所有旅行。

标签: mysql sql inner-join


【解决方案1】:

如果 trips 表的列中没有国家/地区,那么要查找到 Greece 的所有旅行,您必须将此表链接到另一个表。 如果 tripslikes 是唯一一张带有国家/地区列的表格,那么恐怕无法找到所有前往希腊的旅行,而那里没有类似的旅行。 请尝试查找除了 tripslikes 表之外是否有任何方法可以将旅行链接到国家/地区。

【讨论】:

    【解决方案2】:

    如果你想带着喜欢的去希腊旅行,你可以使用EXISTS

    SELECT T.*
    FROM trips T
    WHERE T.country_name = 'Greece' AND
          EXISTS (SELECT 1
                  FROM tripslikes L
                  WHERE T.trip_id = L.trip_id
                 );
    

    这将删除重复项。如果您想要没有赞的旅行,请切换到NOT EXISTS

    SELECT T.*
    FROM trips T
    WHERE T.country_name = 'Greece' AND
          NOT EXISTS (SELECT 1
                      FROM tripslikes L
                      WHERE T.trip_id = L.trip_id
                     );
    

    【讨论】:

    • 非常感谢!我正在使用此代码---->(请参阅问题上的更新 1)并且我得到 3 行而不是 4 行,这是我的问题。如何获得总为 0 的第四行。有什么想法吗?
    • @ΠέτροςΠολλάκης。 . .我认为这回答了你原来的问题。如果您有不同的问题,请提供示例数据、期望的结果以及您想要的逻辑的清晰解释。
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2014-03-11
    相关资源
    最近更新 更多