2010-01-17 40 views
7

Tôi có bảng trong DB của tôi được gọi là "sinh viên" chứa các cột sau (student_id, student_name, year_of_birth) .và mảng năm Tôi cố gắng tạo một truy vấn nhận được 10 student_id của mỗi năm trong mảng (năm).mysql nhiều giới hạn trong một câu lệnh sql

tôi có thể viết

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) 

Nhưng điều đó sẽ rất tốn thời gian Có bất kỳ tùy chọn khác Cảm ơn bạn

Trả lời

1

Nếu bạn lo ngại rằng các truy vấn sẽ trả về nhiều tập kết quả, bạn có thể ném a UNION ALL ở giữa mỗi 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 
... 

Điều này có thể tất nhiên được kết hợp với cách tiếp cận của alexn tạo ra các truy vấn từ một mảng của năm.

Tôi làm không nghĩ rằng điều này sẽ cho bạn hiệu suất tốt hơn nhiều so với truy vấn riêng biệt, nhưng nó có thể (trong phiên bản MySQL sau này) vì nó cung cấp cho cơ sở dữ liệu thêm một chút thông tin về những gì bạn đang làm.

0

Sử dụng một phụ truy vấn liên kết trở lại với bảng:

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) 

Chỉ có một vấn đề mặc dù: điều này sẽ chỉ làm việc nếu bạn sử dụng MySQL 5.1 trở lên.

Cách khác là sử dụng một tuyên bố công đoàn:

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

này sẽ làm việc cho một phạm vi rộng lớn hơn của phiên bản MySQL.

0

Đây cũng là một trong những ví dụ để tìm các năm nhuận với nhiều giới hạn

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) 
0

tại sao không chỉ đơn giản là làm điều đó:

$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']; 
} 

mảng $students của bạn sẽ chứa mảng của id sinh viên với các phím là năm sinh.

+0

nếu bạn quan tâm nhiều hơn đến giới hạn, bạn có thể giới hạn trong php, với bộ đếm. –

Các vấn đề liên quan