【问题标题】:SQL JOIN duplicating rowsSQL JOIN 重复行
【发布时间】:2011-12-30 02:09:47
【问题描述】:

我正在尝试加入 2 个表并为每个项目获取一行。评分的默认值为 45。每当一个类别中有不同的评分时,每个项目行都会重复。下面是一个示例架构、数据和结果。

表 1
--------------------------
身份证 |项目 |类别
--------------
1 |项目1 |猫1
2 |项目2 |猫1
3 |项目3 |猫1

表 2
---------------------------
身份证 |评级 |类别
---------------
1 | 37 |猫1
2 | 42 |猫1
3 | 45 |猫1

结果
------------------------------------
身份证 |项目 |评级 |类别
------------------------------------------------
1 |项目1 | 37 |猫1
1 |项目1 | 42 |猫1
1 |项目1 | 45 |猫1
2 |项目2 | 37 |猫1
2 |项目2 | 42 |猫1
2 |项目2 | 45 |猫1
3 |项目3 | 37 |猫1
3 |项目3 | 42 |猫1
3 |项目3 | 45 |猫1

预期结果
------------------------------------
身份证 |项目 |评分
------------------------------------------------
1 |项目1 | 37
2 |项目2 | 42
3 |项目3 | 45

查询:
SELECT p.ofid,p.item,r.rating FROM table1 AS p INNER JOIN table2 AS r ON p.category = r.category WHERE p.category = "cat1" GROUP BY p.ofid,p.category,r.rating

我尝试添加 DISTINCT、JOIN、LEFT JOIN、RIGHT JOIN.... 有帮助吗?

提前致谢。

【问题讨论】:

  • 请注意,您的“预期结果”有四列,而您的选择语句仅选择三列。我认为这是一个错字。
  • 非常正确。已编辑。谢谢你的收获。

标签: mysql


【解决方案1】:

根据您想要的预期结果,我相信您加入了错误的领域。下面应该可以工作。

Select
  p.ofid,
  p.item,
  r.rating
From table1 p 
Inner Join table2 r On r.ofid = p.ofid
where p.category ="cat1"

【讨论】:

  • 更正!!!!我想我只是盯着这个看太久了。尊敬的先生!
【解决方案2】:

也许我理解错了,但你不想加入 ofids 吗?

SELECT p.ofid,p.item,r.rating 
FROM table1 AS p 
INNER JOIN table2 AS r 
    ON p.category = r.category AND p.ofid = r.ofid 
WHERE p.category = "cat1" 
GROUP BY p.ofid,p.category,r.rating

【讨论】:

    【解决方案3】:

    这是一个完全正常的结果,因为您正在对您选择的所有 3 个字段进行分组。如果您想要结果集中每个 ofid 的 SINGLE 副本,则只执行 GROUP BY p.ofid

    【讨论】:

    • 我也试过了。它确实给出了正确的行数,但是它为所有 3 个评级给出了 45。
    • 这也是意料之中的。你希望收视率是多少?该ofid的所有收视率的平均值?然后select avg(p.ofid) ...
    【解决方案4】:

    除了(或代替?)category,您可能还想加入ofidtable1 中的所有三个条目都有"cat1"table2 中的所有三个整体也都有"cat1",因此table1 中的每条记录都匹配table2 中的所有三个记录。因此,结果中预期有 3 x 3 = 9 行。你可能想要这样的东西:

    SELECT p.ofid,p.item,r.rating
    FROM table1 AS p
    INNER JOIN table2 AS r ON p.category = r.category
                           AND p.ofid = r.ofid
    WHERE p.category = "cat1"
    GROUP BY p.ofid,p.category,r.rating
    

    【讨论】:

      【解决方案5】:

      我相信这就是你想要做的?

      SELECT p.offid,p.item,r.rating,r.category FROM table1 p INNER JOIN table2 r
      ON p.category = r.category
      AND p.offid = r.offid
      WHERE p.category = 'cat1'
      

      【讨论】:

        猜你喜欢
        • 2014-02-03
        • 1970-01-01
        • 2015-04-19
        • 2017-09-12
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多