10/10/2018, 09:23

ai có lệnh truy vấn lấy 2 mẫu tin trước và sau ko

vd tôi có 1 bảng như sau
1
2
3
4
5
bây giờ chỉ với 1 câu lệnh sql tôi muốn lấy 2 mẫu tin lớn hơn 3 và 2 mẫu tin nhỏ hơn 3 thì làm sao vậy
cảm ơn nha
Kanzai viết 11:35 ngày 10/10/2018
Giả sử table tên là tableA, trong có 1 field là num, chứa các giá trị từ 1 đến 5 như bác nói. Bây giờ muôn lấy 2 mẫu tin lớn hơn 3 và 2 mẫu tin nhỏ hơn 3 thì làm thế này :
SELECT num FROM tableA WHERE num != 3
kiem_bo viết 11:27 ngày 10/10/2018
cái này khó quá
vd trường hợp tôi có trường hợp tôi có 1000 mâũ tin trường hợp tôi muốn lâý 2 mâũ tin có id lớn hơn 350 và 2 mâũ tin có id nhỏ hơn 350 thì làm sao vâỵ
duongdangquoc viết 11:32 ngày 10/10/2018
chịu khó tìm hiểu cái union đi, hoặc sử dụng nhiều câu select lông nhau.
ví dụ:
select num from table A where num<350 and num<350-2
union all
select num from table A where num>350 and 350+2
Đúng hay không thì chưa kiểm tra vì đang online ngoài tiệm net.
fotech_nd viết 11:39 ngày 10/10/2018
Được gửi bởi kiem_bo
vd tôi có 1 bảng như sau
1
2
3
4
5
bây giờ chỉ với 1 câu lệnh sql tôi muốn lấy 2 mẫu tin lớn hơn 3 và 2 mẫu tin nhỏ hơn 3 thì làm sao vậy
cảm ơn nha
Giả sử tên bảng là contents
tên cột là c_num
giá trị mốc là *** (là 3 trong ví dụ của bạn)
thì bạn có thể dùng câu sql:

SELECT *
FROM contents
WHERE c_num
IN (
(

SELECT max( c_num )
FROM contents
WHERE c_num < ***
), (

SELECT max( c_num )
FROM contents
WHERE c_num < (
SELECT max( c_num )
FROM contents
WHERE c_num < *** )
), (

SELECT min( c_num )
FROM contents
WHERE c_num > ***
), (

SELECT min( c_num )
FROM contents
WHERE c_num > (
SELECT min( c_num )
FROM contents
WHERE c_num > *** )
)
)
AND c_num != ***

Regards!!!
happyman_1x viết 11:28 ngày 10/10/2018
phải phức tạp vậy sao? không thể đơn giản như:

select c_num from contents where c_num != {num} and c_num < {num} + 3 and c_num > {num}-3

{
giả thiết:
tên bảng là contents
tên cột là c_num
giá trị mốc là {num}(là 3 trong ví dụ của bạn)
}

Nếu không đúng, xin chỉ giáo vì lâu lắm không viết sql statement nữa....
fotech_nd viết 11:25 ngày 10/10/2018
Được gửi bởi happyman_1x
phải phức tạp vậy sao? không thể đơn giản như:

select c_num from contents where c_num != {num} and c_num < {num} + 3 and c_num > {num}-3

{
giả thiết:
tên bảng là contents
tên cột là c_num
giá trị mốc là {num}(là 3 trong ví dụ của bạn)
}

Nếu không đúng, xin chỉ giáo vì lâu lắm không viết sql statement nữa....
Cách như bạn chỉ đúng khi c_num là tuần tự 1,2,3,4,... thôi. Nếu c_num là 1,113,116,911,... thì không thể chạy được. Thực ra còn có cách nữa viết ngắn hơn nhưng tốc độ chậm hơn nhiều (mình cũng chưa test xem có chạy được không) nên mình cũng ko đưa ra.

Regards!!!
Mahakaruna viết 11:26 ngày 10/10/2018
Cậu bắt buộc phải chạy 2 câu truy vấn sau :

SELECT * FROM `table`
WHERE `id` > x
ORDER BY `id` ASC
LIMIT y

SELECT * FROM `table`
WHERE `id` < x
ORDER BY `id` DESC
LIMIT y

=> Giả sử n là số row trg table trên. Chạy 2 câu này thì dbms phải quét qua n+1 row

Còn nếu muốn gọp lại = 1 câu truy vấn thì đây :

(SELECT * FROM `table`
WHERE `id` > x
ORDER BY `id` ASC
LIMIT y)
UNION
(SELECT * FROM `table`
WHERE `id` < x
ORDER BY `id` DESC
LIMIT y)

=> Giả sử n là số row trg table trên. Chạy câu uninon này thì dbms phải quét qua 2n row => ghê vãi

Cậu phải xem lại cách tổ chức thôi,
Với cái table trên thì chắc chắn câu truy vấn nào thỏa đc nhu cầu trên của cậu đều phải quét qua tối thiểu n dòng => toi ngay
happyman_1x viết 11:24 ngày 10/10/2018
Được gửi bởi fotech_nd
Cách như bạn chỉ đúng khi c_num là tuần tự 1,2,3,4,... thôi. Nếu c_num là 1,113,116,911,... thì không thể chạy được. Thực ra còn có cách nữa viết ngắn hơn nhưng tốc độ chậm hơn nhiều (mình cũng chưa test xem có chạy được không) nên mình cũng ko đưa ra.

Regards!!!
--> :o tớ đâu có biết đâu, chủ topic đâu có nêu vụ số không liên tục này...

Đồng ý với cách của Mahakaruna. Riêng về tốc độ, tớ nghĩ thiết lập index cho `id` (mà hình như đã dùng `id`, thì default nó là key index rồi) của bạn sẽ tăng được tốc độ lên.

Được gửi bởi Mahakaruna
Cậu bắt buộc phải chạy 2 câu truy vấn sau :

SELECT * FROM `table`
WHERE `id` > x
ORDER BY `id` ASC
LIMIT y

SELECT * FROM `table`
WHERE `id` < x
ORDER BY `id` DESC
LIMIT y

=> Giả sử n là số row trg table trên. Chạy 2 câu này thì dbms phải quét qua n+1 row

Còn nếu muốn gọp lại = 1 câu truy vấn thì đây :

(SELECT * FROM `table`
WHERE `id` > x
ORDER BY `id` ASC
LIMIT y)
UNION
(SELECT * FROM `table`
WHERE `id` < x
ORDER BY `id` DESC
LIMIT y)

=> Giả sử n là số row trg table trên. Chạy câu uninon này thì dbms phải quét qua 2n row => ghê vãi

Cậu phải xem lại cách tổ chức thôi,
Với cái table trên thì chắc chắn câu truy vấn nào thỏa đc nhu cầu trên của cậu đều phải quét qua tối thiểu n dòng => toi ngay
kiem_bo viết 11:30 ngày 10/10/2018
do thiếu sót nên tôi ko nói vụ id có liên tiếp ko cho dù có liên tiếp đi nữa trường hợp tôi xóa 10 mẫu tin ở vị trí 10-19 trước đó đi có nghĩa là
1
2
3
4
5
6
7
8
9
20
21
21
cảm ơn anh em nha. Tôi sẽ chạy thử. À tôi ko hiểu cách truy vấn đệ quy ko. Có nghĩa là truy vấn lấy dữ liệu ra rồi lấy dữ liệu vừa truy vấn để tiếp tục làm đk để truy vấn tiếp nữa mà chỉ ở trên 1 dòng
Bài liên quan
0