mysql - 在 SQL 中创建修改后的 GROUP 选择

标签 mysql

我正在尝试为 SQL 做一些非常标准的事情,但我不知道如何谷歌或搜索它,因为我只能解释我想要实现的目标。

如果我有一张 table :

Table X:
ID | PID | TID
1  |  1  | 2
2  |  1  | 3
3  |  2  | 3
4  |  3  | 4
5  |  4  | 1
6  |  2  | 2

我想按PID分组(从整个表中仅获取每个PID一次),但一定要获取指定中的值>TID(因为正常组只会随机选择它们)。那么,如果将 TID 指定为 '2',我希望查询结果是什么:

Result:
ID | PID | TID
1  |  1  |  2
4  |  3  |  4 -- 4 because from all over the table and it does not have TID = 2 where PID = 3
5  |  4  |  1 -- 5 because the same as above
6  |  2  |  2 -- This is where the normal GROUP would mess up as it would give ID = 3 instead of ID = 6

具有 ID23 的值将被跳过,因为它们具有的 PID 也与 TID = 2

谢谢!

最佳答案

总的来说,分组是正确的方式。棘手的部分是获取按指定方式排序的结果,即 tid=2 应该是第一个条目。仅按 tid 排序会首先给出 tid=1 结果。解决方案是使用平方函数 y = (x - m)^2,其中 m 等于您要查找的值,因此 m = 2.

将所有这些打包到一个查询结果中

SELECT 
  SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY (POW((tid - 2), 2))), ',', 1 ), 
  pid, 
  SUBSTRING_INDEX(GROUP_CONCAT(tid ORDER BY (POW((tid - 2), 2))), ',', 1 ) 
FROM so1 
GROUP BY pid 
ORDER BY AVG((POW((tid - 2), 2))) ASC

产生

id  pid tid
1   1   2
6   2   2
5   4   1
4   3   4

关于请求按 id 对结果进行排序的注释,您可以将查询包装在一个简单的 select 语句中:

SELECT x.* 
FROM (
  SELECT 
    SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY (POW((tid - 2), 2))), ',', 1 ) as id, 
    pid, 
    SUBSTRING_INDEX(GROUP_CONCAT(tid ORDER BY (POW((tid - 2), 2))), ',', 1 ) as tid 
  FROM so1 
  GROUP BY pid 
  ORDER BY AVG((POW((tid - 2), 2))) ASC
) x 
ORDER BY x.id

关于mysql - 在 SQL 中创建修改后的 GROUP 选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45478024/

相关文章:

mysql - 如何将数据从生产数据库迁移到开发数据库 (Rails 4)?

php - 需要连续检索标题、描述和上传的图像并使用 php 显示它们

php - MYSQL不会返回超过1个类别

php - 在 php 和 Mysql 中插入用于存储全局站点首选项的查询

mysql - 将 TEXT 转换为 INT 字段 (submit_date)

mysql - 如何为表中的新行创建外键? - mysql - CodeIgniter

python - 如何将 MYSQL Latin-1 GEOMETRY 字段转换为 UTF8 以使其与 Django 一起使用?

python - 使用 Django ORM 注释计算 2 个表值之和的查询

mysql - Mongo - MySql 之间喜欢

mysql - 选择前 n 金额(考虑某些记录具有相同金额)