防止MySQL中左连接与内部连接的重复
这是我的sql。如果matches\u times表中存在重复条目,则无法过滤查询中的重复项防止MySQL中左连接与内部连接的重复,mysql,sql,join,left-join,Mysql,Sql,Join,Left Join,这是我的sql。如果matches\u times表中存在重复条目,则无法过滤查询中的重复项 SELECT info.user_id, info.name, info.age, info.gender, DATE_FORMAT(likes.time, '%c/%e/%y') AS matchedTime, DATE_FORMAT(matches_times.proposed_time, '%b %d, %Y @ %h:%i %p') AS proposedTime,
SELECT
info.user_id,
info.name,
info.age,
info.gender,
DATE_FORMAT(likes.time, '%c/%e/%y') AS matchedTime,
DATE_FORMAT(matches_times.proposed_time, '%b %d, %Y @ %h:%i %p') AS proposedTime,
matches_times.agreed
FROM info
INNER JOIN likes
ON info.user_id = likes.liked_user_id
AND likes.user_id = ?
LEFT JOIN matches_times
ON (info.user_id = matches_times.user_id_1 OR info.user_id = matches_times.user_id_2)
AND (matches_times.user_id_1 = ? OR matches_times.user_id_2 = ?)
WHERE likes.liked_user_id IN (SELECT
user_id
FROM likes
WHERE likes.liked_user_id = ?)
ORDER BY
CASE
WHEN matches_times.proposed_time IS NULL THEN likes.time
WHEN matches_times.proposed_time IS NOT NULL THEN matches_times.proposed_time
END DESC
三个表格如下:
喜欢
信息
比赛时间
编辑:
这里描述了这个问题
一个简单的方法是基于这样一个事实,即您可以使用具有distinct(o等效视图)的子选择 在选择中,参考t.U时间 如果您需要max,则不需要distinct,但需要group by,例如:
LEFT JOIN (
select user_id_1, user_id_2, max(DATE_FORMAT(proposed_time, '%b %d, %Y @ %h:%i %p')) as proposed_time
from matches_times
group by user_id_1, user_id_2
) t ON (info.user_id = t.user_id_1 OR info.user_id = t.user_id_2)
AND (t.user_id_1 = ? OR t.user_id_2 = ?)
mysql或sql server?请参阅提供一些示例数据以及该示例数据的预期结果。感谢您的帮助。虽然“字段列表”中的“未知列”匹配了\u次。建议的\u次,现在没有错误,但仍然得到与我的pic相同的结果,但是我得到了这个错误。我是错过了什么,还是我只是个傻瓜?你有两个不同的时间,所以你得到了两排。。你可能需要这个的最大值或最小值。。然后你只得到一行你能举个例子吗?我不确定我是否100%@lazyboy78答案更新。。希望我的回答有用(至少)
id(pk) | user_id | name | age | gender | timestamp
id(pk) | user_id_1 | user_id_2 | proposed_time | agreed | timestamp
LEFT JOIN (
select distinct user_id_1, user_id_2, DATE_FORMAT(proposed_time, '%b %d, %Y @ %h:%i %p') as proposed_time
from matches_times
) t ON (info.user_id = t.user_id_1 OR info.user_id = t.user_id_2)
AND (t.user_id_1 = ? OR t.user_id_2 = ?)
LEFT JOIN (
select user_id_1, user_id_2, max(DATE_FORMAT(proposed_time, '%b %d, %Y @ %h:%i %p')) as proposed_time
from matches_times
group by user_id_1, user_id_2
) t ON (info.user_id = t.user_id_1 OR info.user_id = t.user_id_2)
AND (t.user_id_1 = ? OR t.user_id_2 = ?)