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
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 !
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
Bài liên quan
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 ....
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?
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 ?
lấy những events mà có cùng state cơ mà