【问题标题】:SQL join and MySQLSQL 连接和 MySQL
【发布时间】:2012-06-04 19:22:43
【问题描述】:

在我的数据库中,我有这些表

products
-------------
id | title  | 
-------------
1    Cheese  
2    Milk
3    Water

等等……

products_to_city

    -----------------------
    city_id | product_id   | 
    -----------------------
    1         1
    1         2
    2         3
    3         1
    3         1

我正在使用这个 sql 查询来获取结果

SELECT
 p.id,
 p.title
 FROM products p
 LEFT JOIN products_to_city ptc ON ptc.id = 1

问题是上面的查询从表中获取所有数据,而不是仅在 city 为 1 的地方获取数据

我做错了什么?

【问题讨论】:

  • 您想在查询中用 1 说什么? id 还是字段号?

标签: mysql sql


【解决方案1】:

您没有告诉查询要加入 productsproducts_to_city 的内容。尤其是LEFT JOIN,它将强制结果集包含products 中的每条记录,对应products_to_city 中的每条记录。我想你想要这个:

SELECT p.id, p.title
FROM products p
INNER JOIN products_to_city ptc
  ON p.id = ptc.product_id
WHERE
  ptc.city_id = 1

【讨论】:

    【解决方案2】:

    使用这个:

    SELECT
     p.id,
     p.title
     FROM products p
     INNER JOIN products_to_city ptc ON ptc.id = p.id
     where ptc.id = 1
    

    【讨论】:

      【解决方案3】:

      您没有将产品加入城市,您得到的是所有产品和城市的匹配。

      SELECT
       p.id,
       p.title
       FROM products p
       LEFT JOIN products_to_city ptc ON ptc.product_id = p.id
       where ptc.city_id = 1
      

      【讨论】:

        【解决方案4】:

        您正在执行外部联接,因此在没有匹配的情况下,无论如何都会返回该行。考虑一个内部连接。

        【讨论】:

          【解决方案5】:

          LEFT JOIN 替换为JOIN

          这是因为LEFT JOIN 甚至将没有对应键的行(在连接的左侧)放入了右表中。

          JOIN 仅从“左”和“右”表中获取满足 pkfk 匹配的列

          所以这将是你的解决方案

          SELECT
          p.id,
          p.title
          FROM products p
          JOIN products_to_city ptc ON ptc.id = 1
          

          【讨论】:

            【解决方案6】:

            请参阅基本问题:LEFT OUTER JOIN vs Left Join,(http://stackoverflow.com/questions/2809594/basic-question-left-outer-join-vs-left-join) 他们是一样的。 你想要左内连接。

            【讨论】:

              【解决方案7】:
              LEFT JOIN products_to_city ptc ON p.id = ptc.id
              

              【讨论】:

              • missed where ptc.id = 1 like in other anwers
              【解决方案8】:

              当你这样做时

              LEFT JOIN products_to_city ptc 
              

              您是在告诉 MySQL(实际上是所有 SQL dbms)返回产品中的所有行,即使它们与连接条件不匹配。

              要仅返回与连接条件匹配的行,请使用

              INNER JOIN products_to_city ptc ON ptc.product_id = p.id AND (something else)
              

              请注意,您需要使用正确的列名连接表。

              我不确定你在那个“其他”子句中想要什么,因为你写的东西——pct.id = 1——通常是你可能在 WHERE 子句中表达的东西。问题是 products_to_city 表没有任何名为“id”的列。

              【讨论】:

                猜你喜欢
                • 2012-10-13
                • 2016-10-08
                • 2014-12-28
                • 2014-02-12
                • 1970-01-01
                • 1970-01-01
                • 2021-01-27
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多