具有MIN COUNT的MYSQL DB SELECT [重复]

问题描述 投票:2回答:1

我有一个数据集作为一个表,它看起来像这样:

###################################
UID    |TID     |MID     |RESULT  |
1      |1       |1       |1       |
2      |1       |1       |2       |
3      |1       |1       |3       |
4      |2       |1       |4       |
5      |2       |1       |5       |
6      |2       |1       |6       |
1      |1       |2       |6       |
2      |1       |2       |5       |
3      |1       |2       |4       |
4      |2       |2       |3       |
5      |2       |2       |2       |
6      |2       |2       |1       |
1      |1       |3       |2       |
2      |1       |3       |4       |
3      |1       |3       |6       |
4      |2       |3       |5       |
5      |2       |3       |3       |
6      |2       |3       |1       |

我现在希望每行的最小量,按TID和MID分组

如果我做这样的事情:

SELECT UID, TID, MID, RESULT  
FROM matches 
WHERE matches.id = '$ID'  
ORDER BY TID, MID, RESULT

我以正确的方式订购了东西。像这样:

###################################
UID    |TID     |MID     |RESULT  |
1      |1       |1       |1       |
2      |1       |1       |2       |
3      |1       |1       |3       |

3      |1       |2       |4       |
2      |1       |2       |5       |
1      |1       |2       |6       |

1      |1       |3       |2       |
2      |1       |3       |4       |
3      |1       |3       |6       |

4      |2       |1       |4       |
5      |2       |1       |5       |
6      |2       |1       |6       |

6      |2       |2       |1       |
5      |2       |2       |2       |
4      |2       |2       |3       |

6      |2       |3       |1       |
5      |2       |3       |3       |
4      |2       |3       |5       |

我现在只想拥有每个块的第一行。计算每个块中每个UID最佳的频率。

我不知道如何在没有在PHP中做很多循环的情况下获得它。如果我使用GROUP BY TID,MID和MIN(RESULT)它会随机接缝,UID即将出现。

解:

SELECT COUNT(*) AS AMOUNT, t1.UID AS UID, t1.TID AS TID, t1.MID AS MID, t1.RESULT AS result
  FROM
  (
    SELECT um.user_id AS UID, um.team_id AS TID, um.match_id AS MID, um.q_result AS RESULT
    FROM user_matches um JOIN league_matches lm
    WHERE um.match_id = lm.id
    AND lm.league_subseason_id = '135'
    ORDER BY TID, MID
  ) t1
  INNER JOIN
  (
    SELECT um.user_id AS UID, um.team_id AS TID, um.match_id AS MID, min(um.q_result) AS min_result
    FROM user_matches um JOIN league_matches lm
    WHERE um.match_id = lm.id
    AND lm.league_subseason_id = '135'
    GROUP BY TID, MID
  ) t2 ON t2.TID = t1.TID AND t2.MID = t1.MID AND t2.min_result = t1.result
 GROUP BY t1.UID ORDER BY AMOUNT DESC
mysql select group-by sql-order-by min
1个回答
1
投票

您可以将子查询与TID和MID的min for column结果组一起使用

  SELECT UID, TID, MID, RESULT  
  FROM matches  m 
  inner join (
    select TID, MID, min(result) min_result
    from matches 
    group by TID, MID 
  ) t on t.TID = m.TID and t.MID = m.MID and t.min_result = m.result 

查看你的代码和示例你在subselect中有一个错误的user_id,你没有分组但是顺序所以我认为你应该这样改变你的代码

SELECT COUNT(*) AS AMOUNT, t1.UID AS UID, t1.TID AS TID, t1.MID AS MID, t1.RESULT AS result
  FROM
  (
    SELECT um.user_id AS UID, um.team_id AS TID, um.match_id AS MID, um.q_result AS RESULT
    FROM user_matches um JOIN league_matches lm
    WHERE um.match_id = lm.id
    AND lm.league_subseason_id = '135'
    ORDER BY TID, MID
  ) t1
  INNER JOIN
  (
    SELECT um.user_id AS UID, um.team_id AS TID, um.match_id AS MID, min(um.q_result) AS min_result
    FROM user_matches um JOIN league_matches lm
    WHERE um.match_id = lm.id
    AND lm.league_subseason_id = '135'
    GROUP BY TID, MID
  ) t2 ON t2.TID = t1.TID AND t2.MID = t1.MID AND t2.min_result = t1.result
 GROUP BY t1.UID ORDER BY AMOUNT DESC 
© www.soinside.com 2019 - 2024. All rights reserved.