10/10/2018, 10:35

Select inner join - giải pháp tối ưu ?

Ví dụ mình select ca sĩ có singer_id = 1 có 2 album id là album_id = 1 và album_id = 2, tiếp tục select những bài hát trong album đó, mình sử dụng câu lện Mysql này

select * from singer as S INNER JOIN album as A ON S.singer_id = A.singer_id INNER JOIN song as SO ON SO.album_id = A.album_id where S.singer_id = 1
với câu lệnh này nó sẽ xuất hiện mảng với các bài hát (song) sẽ có tên ca sĩ (sing) và album, như vậy thì sẽ không tối ưu, mình chỉ muốn nó xuất hiện tên ca sĩ 1 lần để lấy làm tiêu đề, 2 album trong đó gồm tất cả các bài hát. Vui lonhf giải mình bài toán này, thanks !
khuongCOMPUTER viết 12:52 ngày 10/10/2018
Lấy Excel hay Word ra vẽ thử cái table kết quả coi nó hiện ra cái kiểu gì?
notnhacxanh viết 12:41 ngày 10/10/2018
select S.singername,SO.* from singer as S INNER JOIN album as A ON S.singer_id = A.singer_id INNER JOIN song as SO ON SO.album_id = A.album_id where S.singer_id = 1
vvthong viết 12:48 ngày 10/10/2018
Muốn tối ưu hơn bạn muốn lấy field nào trong table thì cứ gọi ra thay vì select *

select [table name].[field name 1],[table name].[field name 2],[table name].[field name 3],....,[table name].[field name n] form [table name] where ....
honnhienh viết 12:45 ngày 10/10/2018
Được gửi bởi vvthong
Muốn tối ưu hơn bạn muốn lấy field nào trong table thì cứ gọi ra thay vì select *

select [table name].[field name 1],[table name].[field name 2],[table name].[field name 3],....,[table name].[field name n] form [table name] where ....
câu này theo tôi nghĩ là nó hog có tối ưu hơn là câu join cua bác kia.Bữa nghe ông thấy nói join chạy nhănh hơn nhiều so với where (cùng một kết quả trả về)
chameron viết 12:37 ngày 10/10/2018
Code:
SELECT DISTINCT s.name,a.name,so.name
FROM singer s 
LEFT JOINT album a ON a.singer_id = s.id
LEFT JOINT song so ON so.album_id = a.id
WHERE s.id = 1
bác thử xem có được ko, chưa test
megaownage viết 12:39 ngày 10/10/2018
@chủ đề bài:
Nguyên tắc của CSDL liên kết là dòng và cột. SQL trả về số dòng có dạng (số và thể loại cột) giống nhau đã là tối ưu rồi. Làm bất cứ cái gì khác cũng là nặng thêm.

Nếu bắt buộc phải làm thì viết một hàm (function) cho nó gọp các albums và songs lại thành một field nvarchar.

@honnhienh:
Bữa nghe ông thấy nói join chạy nhănh hơn nhiều so với where (cùng một kết quả trả về)
Tùy trường hợp. Hầu hết các SQL engines được thiết kế tối ưu hóa công việc join. Tuy nhiên WHERE các trường có index nhanh hơn nhiều!
Hình như ông thầy của bạn muốn nói đến việc lọc tìm liên hệ tự ứng (correlated subquery), trong trường hợp này thì join thường nhanh hơn.

@chameron:
LEFT JOIN không tăng hiệu quả chút nào cả. Người ta bắt buộc phải dùng LEFT JOIN nếu có ca sĩ không có album nào cả (không có album thì INNER JOIN không join được cái gì cả và sẽ trả về 0 dòng)

tb. Hình như cái này thuộc về CSDL, đâu có liên quan gì đến web?
chameron viết 12:38 ngày 10/10/2018
tiện mọi người đang hỏi
em có cái này nhờ các bác giúp
bảng profile có id, state
bảng event có id , profile_id
bây giờ e muốn lấy toàn bộ event của nhữ profile nào có cùng state = 1 chẳng hạn thì viết thế nào ?
Code:
SELECT e.*
FROM event e 
INNER JOIN profile p 
WHERE p.id = e.profile_id
AND p.state = 1
WHERE p.id = e.profile_id là sai phỏng?
binhvn viết 12:51 ngày 10/10/2018
Code:
SELECT 
    e.*
FROM 
    event e 
INNER JOIN 
    profile p ON p.id = e.profile_id AND p.state = 1
Thế này là ok rồi
chameron viết 12:41 ngày 10/10/2018
ko select được anh Bình ah
lấy những events mà có cùng state cơ mà
Bài liên quan
0