解决 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
我的过程:
查找特定用户的所有匹配项
查找该用户匹配的所有日期
找到该用户的第二个匹配项(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;
并发症:
特定用户可以在 a_profile_id 或 b_profile_id 之下,因此他匹配的日期可以是 a_profile_match_available_on 或 b_profile_match_available_on
'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_status和b_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);
第 1 部分:
软件:Mysqlworkbench
Objective:查找特定用户的第二个匹配项
Table: Profile_match
列:a_profile_id、b_profile_id、a_profile_match_available_on、b_profile_match_available_on
我的过程:
查找特定用户的所有匹配项
查找该用户匹配的所有日期
找到该用户的第二个匹配项(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;
并发症:
特定用户可以在 a_profile_id 或 b_profile_id 之下,因此他匹配的日期可以是 a_profile_match_available_on 或 b_profile_match_available_on
'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_status和b_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);