相关疑难解决方法(0)

SQL仅选择列上具有最大值的行

我有这个文件表(这里是简化版):

+------+-------+--------------------------------------+
| id   | rev   | content                              |
+------+-------+--------------------------------------+
| 1    | 1     | ...                                  |
| 2    | 1     | ...                                  |
| 1    | 2     | ...                                  |
| 1    | 3     | ...                                  |
+------+-------+--------------------------------------+
Run Code Online (Sandbox Code Playgroud)

如何为每个id选择一行并且只选择最大转速?
使用上面的数据,结果应该包含两行:[1, 3, ...][2, 1, ..].我正在使用MySQL.

目前,我在while循环中使用检查来检测并覆盖结果集中的旧转速.但这是实现结果的唯一方法吗?是不是有SQL解决方案?

更新
作为答案提示,有一个SQL的解决方案,并且这里sqlfiddle演示.

更新2
我注意到在添加上述sqlfiddle之后,问题被投票的速率超过了答案的upvote率.那不是故意的!小提琴是基于答案,特别是接受的答案.

mysql sql aggregate-functions greatest-n-per-group groupwise-maximum

1142
推荐指数
14
解决办法
107万
查看次数

获取每组分组结果的前n条记录

以下是最简单的可能示例,但任何解决方案都应该能够扩展到需要的n个顶级结果:

根据下面的表格,使用人员,组和年龄列,您将如何获得每组中最老的2个人?(组内的关系不应该产生更多结果,但按字母顺序给出前2个)

+--------+-------+-----+
| Person | Group | Age |
+--------+-------+-----+
| Bob    | 1     | 32  |
| Jill   | 1     | 34  |
| Shawn  | 1     | 42  |
| Jake   | 2     | 29  |
| Paul   | 2     | 36  |
| Laura  | 2     | 39  |
+--------+-------+-----+

期望的结果集:

+--------+-------+-----+
| Shawn  | 1     | 42  |
| Jill   | 1     | 34  |
| Laura  | 2     | 39  |
| …

mysql sql greatest-n-per-group mysql-variables

132
推荐指数
8
解决办法
14万
查看次数

如何选择每个类别的最新四个项目?

我有一个项目数据库.每个项目都使用类别表中的类别ID进行分类.我正在尝试创建一个列出每个类别的页面,在每个类别下面我想要显示该类别中的4个最新项目.

例如:

宠物用品

img1
img2
img3
img4
Run Code Online (Sandbox Code Playgroud)

宠物食品

img1
img2
img3
img4
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过查询每个类别的数据库轻松解决这个问题,如下所示:

SELECT id FROM category

然后迭代该数据并查询每个类别的数据库以获取最新的项目:

SELECT image FROM item where category_id = :category_id 
ORDER BY date_listed DESC LIMIT 4

我想弄清楚的是,如果我可以使用1个查询并获取所有数据.我有33个类别,所以我想也许这有助于减少对数据库的调用次数.

任何人都知道这是否可行?或者,如果33次通话不是那么大,我应该这么简单.

mysql sql greatest-n-per-group

31
推荐指数
2
解决办法
1万
查看次数

简单查询以获取每个ID的最大值

好的,我有一个这样的表:

ID     Signal    Station    OwnerID
111     -120      Home       1
111     -130      Car        1
111     -135      Work       2
222     -98       Home       2
222     -95       Work       1
222     -103      Work       2
Run Code Online (Sandbox Code Playgroud)

这一切都在同一天.我只需要Query来返回每个ID的最大信号:

ID    Signal    Station    OwnerID
111   -120      Home        1
222   -95       Work        1
Run Code Online (Sandbox Code Playgroud)

我尝试使用MAX()和聚合混乱,每个记录的Station和OwnerID都不同.我需要加入吗?

sql sql-server max greatest-n-per-group

19
推荐指数
2
解决办法
4万
查看次数

每组最新N条记录的平均值

我当前的应用程序根据每个用户的所有记录计算点平均值:

SELECT `user_id`, AVG(`points`) AS pts 
FROM `players` 
WHERE `points` != 0 
GROUP BY `user_id`
Run Code Online (Sandbox Code Playgroud)

业务需求已更改,我需要根据每个用户的最近30条记录计算平均值.

相关表格具有以下结构:

桌子:球员; 列:player_id,user_id,match_id,points

表:用户; columns:user_id

以下查询不起作用,但它确实演示了我尝试实现的逻辑.

SELECT @user_id := u.`id`, (
    -- Calculate the average for last 30 records
    SELECT AVG(plr.`points`) 
    FROM (
        -- Select the last 30 records for evaluation
        SELECT p.`points` 
        FROM `players` AS p 
        WHERE p.`user_id`=@user_id 
        ORDER BY `match_id` DESC 
        LIMIT 30
    ) AS plr
) AS avg_points 
FROM `users` AS u
Run Code Online (Sandbox Code Playgroud)

是否有一种相当有效的方法来根据每个用户的最新30条记录计算平均值?

mysql average greatest-n-per-group limit-per-group

10
推荐指数
2
解决办法
8960
查看次数

MySQL:如何获得每组分组的x个结果

可能重复:
mysql:在GROUP BY中使用LIMIT获得每组N个结果?

我有两张桌子:

  1. 项目
  2. 分类

每个项目属于一个类别.我想要做的是每个类别选择5个项目,但总共说20个项目.

SELECT 

   item_id, item_name, items.catid 

FROM

   items, categories

WHERE

   items.catid = categories.catid

GROUP BY items.catid LIMIT 0,5 //5 per category group
Run Code Online (Sandbox Code Playgroud)

编辑:如果每个类别有超过5个项目 - 它们应按item_id排序(数值)

mysql sql group-by greatest-n-per-group

7
推荐指数
1
解决办法
1719
查看次数

需要SQL select查询帮助

我的问题类似于SQL select Group查询.但架构有变化,我想要不同的结果,如下所述.给定链接的解决方案并没有给我正确的解决方案.您可以使用SQL小提琴来解决此问题.

下面是我的表

表格1

+--------+----------+---------+  
| amount | make     | product |  
+--------+----------+---------+  
|    100 | Nokia    | Mobiles |   
|    300 | Samesung | Mobiles |   
|    700 | Micromax | Mobiles |   
|   1000 | Karbonn  | Mobiles |   
|    300 | Lava     | Mobiles |   
|    100 | Floyer   | Gift    |   
|    500 | Arichies | Gift    |   
|    300 | Feeling  | Gift    |   
+--------+----------+---------+  
Run Code Online (Sandbox Code Playgroud)

现在我想显示每个产品的两个最低金额,如果金额相同,则根据make列的升序字母顺序排列任何人...

所以我想构建单个SQL查询,它给出了如下结果.

+--------+----------+---------+  
| amount …
Run Code Online (Sandbox Code Playgroud)

mysql sql database

6
推荐指数
1
解决办法
204
查看次数

laravel 5.1以多对多的关系获得每个类别的相关5个新闻

我被困在这里从2-3小时开始尝试.

我有很多关系:

class Category extends Model
{
    public function news()
    {
        return $this->belongsToMany('App\News');
    }
}  

class News extends Model
{
    public function categories()
    {
        return $this->belongsToMany('App\Category');
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取相关类别的最新5条新闻:

$front_categories = Category::with(array(
        'news'=>function($query){
        $query->where('publish','1')->orderBy('created_at', 'desc')->take(5);}))
       ->where('in_front', 1)->get();
Run Code Online (Sandbox Code Playgroud)

上面的查询对我不起作用,它总共给出了五个结果,而不是每个类别的5个结果.

php many-to-many eager-loading laravel

6
推荐指数
1
解决办法
519
查看次数

组内的mysql限制?

我想限制组内记录的大小,这是我的试用版,如何做到对不对?

mysql> select * from accounts limit 5 group by type;
Run Code Online (Sandbox Code Playgroud)

错误1064(42000):您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便在第1行的"按类别分组"附近使用正确的语法

mysql sql

5
推荐指数
3
解决办法
1万
查看次数

限制分组中的每个组

现在我知道这个问题之前已经被问过好几次了,但是我已经尝试将不同的现有解决方案应用于我的具体问题很长一段时间了,但没有成功。所以我转向这里希望得到一些指导。

我有一个名为 tblanswers 的表,其中包含链接到另一个表中不同问题的答案。我想要的是获取特定问题 ID 的每个答案的计数,但将其限制为每月的第 n 个答案。

来自 tblanswers 的示例数据:

id  qid answer  timestamp
72  162 2       1366027324
71  161 4       1343599200
70  162 2       1366014201
69  161 4       1366011700
68  162 2       1366006729
67  161 3       1366010948
66  162 2       1365951084
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的查询:

SELECT *, COUNT(*) c FROM(
    SELECT answer, timestamp, YEAR(FROM_UNIXTIME(timestamp)) yr, MONTH(FROM_UNIXTIME(timestamp)) mo FROM tblanswers
        WHERE qid = 161
            ORDER BY timestamp ASC
) q GROUP BY YEAR(FROM_UNIXTIME(timestamp)), MONTH(FROM_UNIXTIME(timestamp)), answer
Run Code Online (Sandbox Code Playgroud)

这会给我这样的结果:(样本数据中的日期和数字不准确)

answer  yr      mo  c
1 …
Run Code Online (Sandbox Code Playgroud)

mysql group-by greatest-n-per-group limit-per-group

5
推荐指数
1
解决办法
1179
查看次数