解决mysql查询

时间:2015-06-10 04:03:16

标签: mysql sql mysql-workbench

第1部分

软件:Mysql workbench

目标:查找特定用户的第二场比赛

:Profile_match

:a_profile_id,b_profile_id,a_profile_match_available_on,b_profile_match_available_on

我的流程

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

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

  3. 查找该用户的第二场比赛(ID,日期)

  4. 我的查询

    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

    3. 如照片中所示(导出到excel之后),突出显示的个人资料ID是我正在查看的用户,突出显示的日期是用户收到匹配的日期。 enter image description here

      期望的结果

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

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

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

      第二个问题是此查询仅适用于特定用户。如何扩展这一点,以便为所有用户找到第二场比赛?

      第2部分

      目标: 为所有用户找到第二个相似的

      当前进度:我可以找到特定用户的第二个相似内容,但我的查询无法为所有用户执行此操作

      查询:

      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 个答案:

答案 0 :(得分:1)

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

$temp = array();
foreach($data as $k=>$v){
    if(is_array($v)){
        foreach($v as $key=>$value){
            $temp[] = $value;
        }
    }
}
echo implode(',',$temp);

检查fiddle

<强>更新

检查modified queries

第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;

第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 P2.profile_id=1 AND 
    profile_match_available_on > MIN(profile_match_available_on);