私は2つの列student_name(uniqe制約付き)、student_marksを持つstudent_tableテーブルを持っています。この表から、3 番目に高い成績を収めた生徒の記録を取得する必要があります。
私はこれを試しましたが、間違っています:
select * from student_table orderby(marks) enum(marks)=3;
このクエリを修正するにはどうすればよいですか?
ここに非常に簡単な解決策があります
select *
from marks
order by marks desc
limit 2,1
limit を使用すると、オフセットと長さを使用できます。ここでは、オフセットは 0 から始まるため、2 に設定されています。3 番目のレコードの場合。そして1が限界です。
ここに別の解決策があります
$res=mysql_query("SELECT * from marks order by marks desc");
mysql_data_seek($res, 2);
$row=mysql_fetch_assoc($res));
これを試して
SELECT * FROM `student_table` ORDER BY marks DESC LIMIT 2,1
MySQL では次のことができます。
SELECT * FROM Student_Table ORDER BY Marks LIMIT 2, 1
select * from students_table orderby marks limit 2,1
制限の詳細については、この URL を確認してくださいhttp://php.about.com/od/mysqlcommands/g/Limit_sql.htm
次のクエリは、1 位、2 位、または 3 位に並んでいる学生の数に関係なく、3 位の学生のすべてのレコードを返します。
SELECT student_table.name, student_table.marks
FROM student_table
WHERE student_table.primary_key IN ( SELECT ranked.primary_key
FROM student_table ranked
LEFT JOIN student_table others
ON ranked.marks < others.marks
GROUP BY 1
HAVING COUNT(DISTINCT others.marks) + 1 = 3)
たとえば、student_table
次のようになっているとします。
+---------+-------+
| name | marks |
+---------+-------+
| Alpha | 100 |
| Able | 100 |
| Bravo | 98 |
| Baker | 98 |
| Bone | 98 |
| Charlie | 93 | <-- 3rd place by marks
| Chimp | 93 | <-- 3rd place by marks
| Delta | 85 |
| Echo | 80 |
| Ebert | 80 |
+---------+-------+
クエリは次のようになります。
+---------+-------+
| name | marks |
+---------+-------+
| Charlie | 93 |
| Chimp | 93 |
+---------+-------+
余談ですが、MySQL が DENSE_RANK() をサポートしていれば、クエリは少し簡単になりますが、上記のようにサブクエリを使用してその関数をシミュレートできます。