mysql 表组是什么_MySQL全外部联接3个表,按组和计数

我的查询仅显示了对我有消息的人的记录的子集,而我想返回所有用户的列表,无论他们是否对我有消息以及计数(或true / false,0,1)

SELECT attendee.id, attendee.firstName, attendee.lastName, count(attendee_chat.to)

from attendee_chat

INNER JOIN attendee ON attendee.id = attendee_chat.to

INNER JOIN chat ON attendee_chat.id = chat.attendee_chat_id

WHERE attendee.id <> 1

GROUP BY attendee_chat.to;

图片值一千个字。

f00884b1cf1497cae8b6ada9bab81be3.png

为什么WHERE attendee.id <> 1在那里?

我假设他是与会者#1,我想他不想为自己计数。

正确的假设

首先将与会者表放在FROM中,然后将其联接到可能没有记录的其他表。

SELECT attendee.id, attendee.firstName, attendee.lastName, count(attendee_chat.to)

from attendee

LEFT JOIN attendee_chat ON attendee_chat.to = attendee.id

LEFT JOIN chat ON attendee_chat.id = chat.attendee_chat_id

WHERE attendee.id <> 1

GROUP BY attendee_chat.to;

我将避免进行FULL OUTER JOIN,因为这是不必要的,并且可能导致某些意外结果。

编辑:试试这个。 删除chat表,因为您始终没有从中进行选择,然后对主表attendee中的字段进行分组,而不是对可能不包含任何数据的on表进行分组。

SELECT attendee.id, attendee.firstName, attendee.lastName, count(attendee_chat.to)

from attendee

LEFT JOIN attendee_chat ON attendee_chat.to = attendee.id

WHERE attendee.id <> 1

GROUP BY attendee.id, attendee.firstName, attendee.lastName;

EDIT2:在讨论了他想要对他进行聊天的数量的要求后(第1个)

SELECT attendee.id, attendee.firstName, attendee.lastName,

(SELECT count(1) FROM attendee_chat

WHERE attendee_chat.from = attendee.id and  attendee_chat.to = 1) as chatcount

from attendee ;

EDIT3:关于外部ID的评论后

SELECT attendee.id, attendee.firstName, attendee.lastName, attendee.attendee_id,

(SELECT count(1) FROM attendee_chat

INNER JOIN attendee a2 ON a2.id = attendee_chat.toid

WHERE attendee_chat.fromid = attendee.id and a2.attendee_id = 123

) as chatcount

FROM attendee ;

附: 我已从toid更改为-> toid,因为使用保留字作为对象名称很危险;-) SQL Fiddle这里

好的,但是返回的结果集是相同的,即使我没有收到任何消息,我也要列出所有参与者

尝试修改后的SQL。

太棒了,问题,为什么分组中还有两个字段

因为很多时候,如果您想选择字段而又没有聚合函数,则必须将它们包括在GROUP BY子句中。如果不这样做,某些版本的SQL将引发错误。

我知道了,因此,如果不存在诸如count之类的聚合函数,则在group by中只有一个字段会引发错误,很酷,您发现我没有从聊天表中选择任何内容

即使存在计数并且您在要选择的所有其他字段上没有MAX,MIN,COUNT,AVERAGE等,并且不在GROUP BY子句中,它也会在某些版本的SQL中出错。

我可以使用两个字段而不是三个字段吗?我在测试记录中返回了一些问题,不确定,我正在检查

Ive添加了一张图片,它的与会者列表类似,并且想要在他们旁边显示一个数字,结果存在一些问题,我认为我们对于joinee_chat.to和joinee_chat.id感到困惑

你有Skype吗?

让我们继续聊天中的讨论。

很棒...非常感谢

我没有提到不要让人们感到困惑的另一点是,我将第3方ID集成到系统中,即我没有在动态页面上收到主键,我接收并使用3rd方键来检索主键,我修改了答案并在询问您时是否期望有我不知道的更好解决方案... SELECT attendee.id, attendee.firstName, attendee.lastName, (SELECT count(1) FROM attendee_chat WHERE attendee_chat.from = attendee.id AND attendee_chat.to = (SELECT id from attendee WHERE attendee_id = attendee.attendee_id)) as chat from attendee

您只需在列表中选择外部ID。

抱歉,没有得到您,请您解释一下,我嵌套了另一个子查询来获取ID

太好了,现在使用您的示例,如果我说attendee.id未知,我们需要从传入的eeeetee.attendee_id(123、456或789)中确定它,并在上面的查询中使用它

只需将其添加为where子句即可。

我添加了但没有用,请您复制/粘贴并在小提琴中执行此操作以了解SELECT attendee.id, attendee.firstName, attendee.lastName, (SELECT count(1) FROM attendee_chat WHERE attendee_chat.from = attendee.id AND attendee_chat.to = (SELECT id from attendee WHERE attendee_id = 123)) as chat from attendee

看到但不是实际,请将123(仅)放在IN子句中,123实际上是我,假设我不知道我的id,可以从123确定我的ID,然后运行查询,(将123视为第三方主键,与会者表中的外键)

很酷,我看到一个a2别名,这是因为子查询在外部表中看到了与会者表

是的,它将看到外部查询

酷,你这个人:)

如果您想要对记录进行联接,即使它们在另一个关系中没有匹配的元素,您也可能希望使用OUTER JOIN而不是INNER JOIN。

MySQL:联接类型的快速细分

我没有离开外部连接,但结果相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值