【问题标题】:MySQL Query JOIN 3 tablesMySQL 查询 JOIN 3 个表
【发布时间】:2020-08-09 04:44:37
【问题描述】:

希望加入 3 个表,但在最后一个表中遇到问题。

members

ID | name
---------
1  | John
2  | Jane
3  | Jack

member_points(成员之间可以有多个交易)

ID | date | id_from | id_to
---------------------------
1  | 8/8  |    1    |   2
2  | 8/8  |    1    |   2
3  | 8/8  |    3    |   2

member_ratings(一个会员只能评价另一个会员,一次)

ID | id_from | id_to | rating
-----------------------------
1  |    2    |   1   |   5

每个会员只能对每个会员进行一次评分,并且只能根据member_points 表对他们获得积分的会员进行评分。

我当前的查询实现了这一点,但是我在介绍第三个表时遇到了困难,该表将包含相应的评级。

这是我目前所拥有的:

$sql = '
SELECT *, 
    m.id AS id, 
    c1.id AS id_from, 
    c1.name AS name_from,
    c2.id AS id_to, 
    c2.name AS name_to
FROM member_points AS m
JOIN members AS c1 ON m.id_from = c1.id
JOIN members AS c2 ON m.id_to = c2.id
    and m.id_to='.$_SESSION["userid"].'
GROUP BY name_from';

我的目标是加入第三张桌子,这样我就可以调用相关的评级。

ID | name_from | name_to | rating
----------------------------------
1  |     2     |    1    |   5     
2  |     2     |    3    | pending

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
  • COALESCE(t3.rating, 'pending')

标签: mysql join group-by


【解决方案1】:

@Andrew 你需要像这样使用LEFT JOIN 加入member_ratings 表:

$sql = '
SELECT *, 
    m.id AS id, 
    c1.id AS id_from, 
    c1.name AS name_from,
    c2.id AS id_to, 
    c2.name AS name_to,
    IF(mr.rating IS NULL, 'pending', mr.rating) AS rating 
FROM member_points AS m
JOIN members AS c1 ON m.id_from = c1.id
JOIN members AS c2 ON m.id_to = c2.id
    and m.id_to='.$_SESSION["userid"].'
LEFT JOIN member_ratings AS mr ON mr.id_from = c1.id
    AND mr.id_to = c2.id
GROUP BY name_from';

如果这不是您需要的,请告诉我,我会尽力帮助您。

【讨论】:

  • @Andrew 我发布的原始答案是引用 members 表错误,我现在修复它
  • 这正是我要找的...谢谢您的帮助。
  • @Andrew 在 MySQL 中没有问题,以上是适当或有效的解决方案。
  • @Strawberry 以下是此解决方案如何工作的示例:sqlfiddle.com/#!9/df54c7/1 OP 指示在表格中的数据与他所说的表格中的数据和他想要的数据有一点偏差要显示,但解决方案是有效的。它在member_ratings 表中留下了连接,以便该表中rating 列中的值将包含在结果集中。这就是 OP 所要问的,如何将 rating 的值从 member_ratings 获取到他编写的查询中。
  • 没有。在没有任何聚合函数的情况下,GROUP BY 子句永远不合适。并且永远不要使用SELECT *。不管怎样,下次好带给你。
猜你喜欢
  • 2014-11-14
  • 1970-01-01
  • 2015-05-22
  • 2016-07-04
  • 2013-04-19
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 2017-05-23
相关资源
最近更新 更多