繁体   English   中英

防止在SQL查询中重复

[英]Prevent duplicates in SQL Query

我想要的行为是..

  1. 查看是否有匹配项(您喜欢的user_id,也喜欢您)
  2. 按最近的时间(到目前为止的最近日期/时间)活动进行排序以创建匹配项,即,如果在您已经喜欢我之后又喜欢了您,那么我就是最新的参与者,并且应该显示我的时间戳。
  3. 如果存在matchs_appointment_time.proposed_time,请首先按最接近日期/时间的顺序显示这些行。 最高的行还应该将同意标志设置为1

这是我的三个表的表结构:

喜欢

id(pk) | user_id | liked_user_id | timestamp

信息

id(pk) | user_id | name | age | gender | timestamp

matches_appointment_times

id(pk) | user_id_1 | user_id_2 | proposed_time | agreed | timestamp

这是重复行行为的示例:

在此处输入图片说明

这是与SQL的链接,用于复制我的三个表

http://rextester.com/DFUI4453

这是我的查询:

SELECT
  info.user_id,
  info.name,
  info.age,
  info.gender,
  DATE_FORMAT(likes.time, '%c/%e/%y') AS matchedTime,
  t.proposed_time AS proposedTime,
  t.agreed
FROM info
INNER JOIN likes
  ON info.user_id = likes.liked_user_id
  AND likes.user_id = ?
LEFT JOIN (SELECT
  user_id_1,
  user_id_2,
    MAX(agreed) AS agreed,
  MAX(DATE_FORMAT(proposed_time, '%b %d, %Y @ %h:%i %p')) AS proposed_time
FROM matches_appointment_times
WHERE proposed_time > NOW()
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 = ?)
WHERE likes.liked_user_id IN (SELECT
  user_id
FROM likes
WHERE likes.liked_user_id = ?)
ORDER BY 
CASE
  WHEN t.proposed_time IS NOT NULL AND t.agreed = 1 THEN t.proposed_time
END DESC,
CASE
  WHEN t.proposed_time IS NOT NULL AND t.agreed = 0 THEN t.proposed_time
END DESC,
CASE
  WHEN t.proposed_time IS NULL THEN likes.time
END DESC

 Please use Distinct in Subquery: SELECT info.user_id, info.name, info.age, info.gender, DATE_FORMAT(likes.time, '%c/%e/%y') AS matchedTime, t.proposed_time AS proposedTime, t.agreed FROM info INNER JOIN likes ON info.user_id = likes.liked_user_id AND likes.user_id = ? LEFT JOIN (SELECT Distinct user_id_1, user_id_2, MAX(agreed) AS agreed, MAX(DATE_FORMAT(proposed_time, '%b %d, %Y @ %h:%i %p')) AS proposed_time FROM matches_appointment_times WHERE proposed_time > NOW() 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 = ?) WHERE likes.liked_user_id IN (SELECT user_id FROM likes WHERE likes.liked_user_id = ?) ORDER BY CASE WHEN t.proposed_time IS NOT NULL AND t.agreed = 1 THEN t.proposed_time END DESC, CASE WHEN t.proposed_time IS NOT NULL AND t.agreed = 0 THEN t.proposed_time END DESC, CASE WHEN t.proposed_time IS NULL THEN likes.time END DESC 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM