解决 mysql 查询

Solving mysql query

第 1 部分:

软件:Mysqlworkbench

Objective:查找特定用户的第二个匹配项

Table: Profile_match

:a_profile_id、b_profile_id、a_profile_match_available_on、b_profile_match_available_on

我的过程:

  1. 查找特定用户的所有匹配项

  2. 查找该用户匹配的所有日期

  3. 找到该用户的第二个匹配项(id、日期)

我的查询:

select * from profile_match
where (a_profile_id = '*****' and a_profile_match_available_on is not null)
or (b_profile_id = '*****' and b_profile_match_available_on is not null)
order by a_profile_match_available_on asc limit 1,1;

并发症:

  1. 特定用户可以在 a_profile_id 或 b_profile_id 之下,因此他匹配的日期可以是 a_profile_match_available_on 或 b_profile_match_available_on

  2. 'order by' 没有帮助,因为所需的日期可以是 a_profile_match_available_on 或 b_profile_match_available_on

如照片所示(导出到 excel 后),突出显示的个人资料 ID 是我正在查看的用户,突出显示的日期是用户收到匹配项的日期。

期望的结果

结果 1:也许可以创建一个新列,其中包含与该用户匹配的所有人员的 ID(非突出显示的 ID),另一列包含所有突出显示的日期

结果 2:也许只有 4 列。 1 列是用户的 id,1 列是用户匹配的 id,1 列是用户匹配的日期,1 列是用户匹配的日期

~~~~用户 Dharmesh Patel 插图~~~~: fiddle

第二个问题是此查询仅针对特定用户。我如何扩展它以便我可以为我的所有用户找到第二个匹配项?

第 2 部分:

Objective: 为所有用户找到第二个互赞

当前进度:我可以找到特定用户的第二个互赞,但我的查询无法为我的所有用户完成

查询:

select * from profile_match
where (a_profile_id = '*****'
or b_profile_id = '*****')
and (a_profile_match_status = 1 and b_profile_match_status = 1)
order by created_on asc limit 1,1;

信息:a_profile_match_statusb_profile_match_status只取0或1的值。当两者都为1时,这意味着两个用户都喜欢对方。 Created_on 只是两个用户表示喜欢的日期。

谢谢大家!

对于第 1 部分,您可以尝试以下查询:

SELECT * FROM profile_match
WHERE (a_profile_id = 1 AND a_profile_match_available_on is not null)
    OR (b_profile_id = 1 AND b_profile_match_available_on is not null)
ORDER BY (case when a_profile_id=1 
    THEN a_profile_match_available_on 
    ELSE b_profile_match_available_on end
) asc limit 1,1;

检查以下 fiddle

更新

检查以下 modified queries:

第 1 部分

SELECT * FROM (SELECT P1.* FROM 
    (SELECT 
        a_profile_id AS profile_id, 
        a_profile_match_available_on as profile_match_available_on 
    FROM profile_match 
    UNION SELECT 
        b_profile_id  AS profile_id, 
        b_profile_match_available_on as profile_match_available_on 
    FROM profile_match) AS P1
) AS P2
GROUP BY P2.profile_id
HAVING P2.profile_id=1 AND 
    profile_match_available_on > MIN(profile_match_available_on);

第 2 部分

SELECT * FROM (SELECT P1.* FROM 
    (SELECT 
        a_profile_id AS profile_id, 
        a_profile_match_available_on as profile_match_available_on 
    FROM profile_match 
    UNION SELECT 
        b_profile_id  AS profile_id, 
        b_profile_match_available_on as profile_match_available_on 
    FROM profile_match) AS P1
) AS P2
GROUP BY P2.profile_id
HAVING profile_match_available_on > MIN(profile_match_available_on);