【问题标题】:Querying 2 Tables in a single query在单个查询中查询 2 个表
【发布时间】:2010-11-14 00:46:23
【问题描述】:

我有一个帖子表和一个类别表,我想要的是选择特定类别中的帖子。问题是类别存储在另一个表中而不是在帖子表中,这是示例:

帖子

id   title       body
---------------------------
125  Some title  Blah blah

类别

postid  category
----------------
125     politic

我想在单个查询中通过示例获取政治类别中的帖子,该怎么办?

【问题讨论】:

    标签: php sql mysql join


    【解决方案1】:

    用途:

    SELECT p.id,
           p.title, 
           p.body
      FROM POSTS p
      JOIN CATEGORIES c ON c.postid = p.id
     WHERE c.category = 'politic'
    

    我对您的 CATEGORIES 表的问题是,将类别值存储为字符串意味着数据未标准化 - 您应该有一个 CATEGORY 表:

    类别

    • category_id(主键,auto_increment)
    • category_description

    ...并使用CATEGORIES 表中的category_id 值:

    类别

    • category_id(CATEGORY.category_id 的主键、外键)
    • post_id(POSTS.postid 的主键、外键)

    【讨论】:

    • 好点。除了通常允许多对多关系和更好的形式外,具有相关帖子的类别有点倒退。
    • 另外,从样本数据中并不清楚,但实际上似乎一篇帖子可能只有一个类别(1 到 1)[从他的“类别”措辞]。如果是这种情况,那么类别 id 应该在 post 表中。也许我读得太多了。
    • 将类别名称存储为字符串并不意味着数据未标准化。整数标识符并不比字符串标识符“更规范化”。除非类别的属性不仅仅是它们的名称,否则您实际上已经引入了一个完全不必要的表。
    • 我猜存储“politic”、“POLitic”、“POLOTIC”等与 INT 值的可能性在某些情况下会丢失......
    【解决方案2】:
    select p.* 
    from posts p 
    inner join categories c 
           on p.id = c.postid 
    where 
         c.category = 'politic'
    

    【讨论】:

      【解决方案3】:

      您需要在查询中加入这两个表

      SELECT *
      FROM posts P
      INNER JOIN categories C on C.post_id = P.id
      WHERE C.category = 'politic'
      

      您可以直观地(这在技术上并不完全正确的解释)将此连接视为将类别字段附加到具有共享 id 的帖子中的一行(这是 'on C.post_id = P.id')。 WHERE 子句表示您只需要那些 category 为 'politic' 的行。

      内连接是几种连接类型之一。尤其是左连接是另一种常见的方法,它在这种情况下的不同之处在于,仍然会列出类别中没有匹配的帖子行,但类别中的字段为空。 (使用内部连接不会保留这样的行)

      http://en.wikipedia.org/wiki/Join_%28SQL%29

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-16
        • 1970-01-01
        • 2015-12-09
        • 1970-01-01
        • 2013-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多