我有这个文件表(这里是简化版):
+------+-------+--------------------------------------+
| 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
以下是最简单的可能示例,但任何解决方案都应该能够扩展到需要的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 | | …
我有一个项目数据库.每个项目都使用类别表中的类别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次通话不是那么大,我应该这么简单.
好的,我有一个这样的表:
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都不同.我需要加入吗?
我当前的应用程序根据每个用户的所有记录计算点平均值:
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条记录计算平均值?
我有两张桌子:
每个项目属于一个类别.我想要做的是每个类别选择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排序(数值)
我的问题类似于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) 我被困在这里从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个结果.
我想限制组内记录的大小,这是我的试用版,如何做到对不对?
mysql> select * from accounts limit 5 group by type;
Run Code Online (Sandbox Code Playgroud)
错误1064(42000):您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便在第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 ×8
sql ×7
group-by ×2
average ×1
database ×1
laravel ×1
many-to-many ×1
max ×1
php ×1
sql-server ×1