множественный лимит mysql в одном выражении sql - PullRequest
8 голосов
/ 17 января 2010

У меня есть таблица в моей БД под названием «студенты» содержит следующие столбцы (student_id, student_name, year_of_birth). и массив лет Я пытаюсь сделать один запрос, который получает 10 student_id каждого года в массиве (years).

Я мог бы написать

SELECT student_id FROM `students` WHERE year_of_birth=1950 LIMIT 10;
SELECT student_id FROM `students` WHERE year_of_birth=1951 LIMIT 10;
SELECT student_id FROM `students` WHERE year_of_birth=1952 LIMIT 10;
SELECT student_id FROM `students` WHERE year_of_birth=1953 LIMIT 10;
(and so on)

Но это было бы очень много времени Есть ли другие варианты Спасибо

Ответы [ 5 ]

7 голосов
/ 17 января 2010

"выберите N строк для группы в MySQL": http://explainextended.com/2009/03/06/advanced-row-sampling/

2 голосов
/ 17 января 2010

Если вы обеспокоены тем, что запросы будут возвращать несколько наборов результатов, вы можете добавить UNION ALL между каждым SELECT:

SELECT student_id FROM `students` WHERE year_of_birth=1950 LIMIT 10
UNION ALL
SELECT student_id FROM `students` WHERE year_of_birth=1951 LIMIT 10
UNION ALL
...

Это, конечно, можно сочетать с подходом alexn к генерации запроса из массива лет.

Я делаю не думаю, что это даст вам гораздо лучшую производительность, чем отдельные запросы, но может (в будущей версии MySQL), так как это дает ядру базы данных немного больше информации о том, что вы делаете .

1 голос
/ 17 января 2010

Используйте подзапрос, который ссылается на таблицу:

SELECT student_id FROM `students` AS s1
WHERE student_id IN 
  (SELECT s2.student_id FROM `students` AS s2
     WHERE s1.year_of_birth = s2.year_of_birth
     LIMIT 10)

Только одна проблема: это будет работать, только если вы используете MySQL 5.1 или выше.

Альтернатива - использовать оператор объединения:

for ($year = 1950; $year < 2000; $year++) {
  $stmts[] = "SELECT student_id FROM `students` 
                WHERE year_of_birth = $year LIMIT 10";
}
$sql = implode(' UNION ALL ', $stmts;

Это будет работать для более широкого диапазона версий MySQL.

0 голосов
/ 28 ноября 2013

почему бы просто не сделать это:

$studentIds = array(1950, 1951, 1952, 1953);

$sql = "
   SELECT
        student_id,
        year_of_birth
    FROM
        students
    WHERE
        student_id IN (" . implode(',', $studentIds) . ")
";

$result = mysql_query($sql);

$students = array();
while($row = mysql_fetch_assoc($result)) {
    $students[$row['year_of_birth']] = $row['student_id'];
}

Ваш массив $students будет содержать массивы идентификаторов учеников с ключами как года рождения.

0 голосов
/ 19 июля 2012

Это также один из примеров поиска високосного года с несколькими ограничениями

select year_n from the_years

select distinct month_n from the_months,the_years where year_n=$P{Year}

(select distinct day_n from the_days,the_months where $P{Month} IN('Jan','Mar','May','Jul','Aug','Oct','Dec') limit 31)
UNION ALL
(select distinct day_n from the_days,the_months where $P{Month} IN('Apr','Jun','Sep','Nov') limit 30)
UNION ALL
(select distinct day_n from the_days,the_years,the_months where $P{Month}='Feb' and mod($P{Year},4)!=0 or mod($P{Year},100)=0  or mod($P{Year},400)=0  limit 28)
UNION ALL
(select distinct day_n from the_days,the_years,the_months where $P{Month}='Feb' and mod($P{Year},4)=0 and mod($P{Year},100)!=0 or mod($P{Year},400)=0 limit 29) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...