SQL加入后鲜明
问题描述:
我试图得到一个基于从B列条件SQL加入后鲜明
的问题是,如果我所有的条件不会被尊重不同的值。
如果我只区分我想要的值,则列B数据不会连接。
什么有我想:
查询:
SELECT DISTINCT id_conversacion, convo_started, started_by, has_unread, pr_token,
hidden_started, hidden_recipiente, de_persona, para_persona, convo_perteneciente
FROM cs_conversaciones
INNER JOIN cs_privatemessages
ON cs_privatemessages.convo_perteneciente = cs_conversaciones.id_conversacion
WHERE cs_privatemessages.de_persona = 123456 OR
cs_privatemessages.para_persona = 123456
ORDER BY id_conversacion
输出(Didnt类型的所有列outputed,只是一个例子):
|id_conversacion|convo_started|started_by|has_unread|pr_token|...etc|
---------------------------------------------------------------------
|1 | 2016-06-05 | 123456 | 0 | dd5f4 |
|1 | 2016-06-05 | 123456 | 0 | 4fd85 |
|2 | 2016-06-05 | 123456 | 0 | 8sa8s |
的outputed列是好的,但不同的(id_conversacion),它应该与cs_privatemessages.convo_perteneciente
重复(1,1,2)
查询B:
SELECT DISTINCT id_conversacion
FROM cs_conversaciones
INNER JOIN cs_privatemessages
ON cs_privatemessages.convo_perteneciente = cs_conversaciones.id_conversacion
WHERE cs_privatemessages.de_persona = 123456 OR
cs_privatemessages.para_persona= 123456
ORDER BY id_conversacion
输出:
我得到的对面,所述不同是确定,但输出的列不是。
|id_conversacion|
-----------------
| 1 |
| 2 |
预期结果(失踪联接列):
|id_conversacion|convo_started|started_by|has_unread|pr_token|de_persona|etc
-------------------------------------------------------------------------
|1 | 2016-06-05 | 123456 | 0 | dd5f4 | 123456 |
|2 | 2016-06-05 | 123456 | 0 | 8sa8s | 126544 |
这让我的事情不同的重复,因为有更多的1行中的连接表。
答
我相信,你试图做的是分组 http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html
SELECT id_conversacion, convo_started, started_by, has_unread, pr_token,
hidden_started, hidden_recipiente, de_persona, para_persona, convo_perteneciente
FROM cs_conversaciones
INNER JOIN cs_privatemessages
ON cs_privatemessages.convo_perteneciente = cs_conversaciones.id_conversacion
WHERE cs_privatemessages.de_persona = 123456 OR
cs_privatemessages.para_persona = 123456
GROUP BY id_conversacion
ORDER BY id_conversacion
但是,你应该在其他列上使用聚合功能,或在其他情况下,就会出现在第一行的结果
答
解决。
连接表中返回重复值:
添加MAX()和解决问题的群体。
查询:
SELECT DISTINCT id_conversacion, convo_started, started_by, has_unread, MAX(pr_token) as pr_token, hidden_started, hidden_recipiente, MAX(de_persona), MAX(para_persona), convo_perteneciente FROM cs_conversaciones INNER JOIN cs_privatemessages ON cs_privatemessages.convo_perteneciente = cs_conversaciones.id_conversacion WHERE cs_privatemessages.de_persona = 123456 OR cs_privatemessages.para_persona = 123456 GROUP BY id_conversacion,pr_token
什么设置导致你放弃的从你的结果'id_conversacion = 1'记录一个逻辑? –
'distinct'在整行上运行,而不是一列,并且由于'pr_token'列中的值发生变化,您将获得更多行。如果您只需要每个id_conversacion一行,您必须决定所需的pr_token值(可能通过应用最小/最大值和分组) – jpw
DISTINCT适用于整个选定的行。如果你只想每个id_conversacion一次,你必须决定为其他列选择哪些值。 – jarlh