10/10/2018, 11:26
select trong 3 table trong php&mysql
hi các bạn , mình đang gặp vấn đề khó khăn cần giúp. lâu nay mình query chỉ độc nhất trong 1 table hoặc nhìu lắm là 2 table cùng lúc. nhưng bây giờ do bài toán đòi hỏi nên phải select trong 3 table ràng buộc lẫn nhau , nên cần các bạn giúp.
table structure:
với i:1,i:3 là mảng đã được mã hóa lại , nghĩa là cá nhân này có genre_id 1 và 3
yêu cầu là lấy các friend của 1 user có user_id = 1, các friend này có tên chứa string "a" và ccó sở thích cá nhân genre = 1
câu query của mình như vậy nhưng có vẻ ko đúng
nhờ các bạn giúp mình ????
table structure:
PHP Code:
table user // chứa thông tin user
user_id , user_name
example : 1 - nguyen viet , 2 - ngoc anh
PHP Code:
table friendship // thông tin về quan hệ bạn bè
user_id , friend_id
example : 1 - 2 , 1 - 3
PHP Code:
table genre // thông tin về sở thích cá nhân
user_id , genres
1 - i:1,i:2,i:3 , 2 - i:1,i:3
yêu cầu là lấy các friend của 1 user có user_id = 1, các friend này có tên chứa string "a" và ccó sở thích cá nhân genre = 1
câu query của mình như vậy nhưng có vẻ ko đúng
PHP Code:
select user.user_id , user.user_name
from user , friendship , genre
where
friendship.user_id = 1
and
friendship.friend_id = user.user_id
and
user.user_name = '%a%'
and
friendship.friend_id = genre.user_id
and
genre.genres like '%i:1%'
Bài liên quan
Cách làm đúng chuẩn là vậy, còn cách làm tối ưu thì còn phải tuỳ vào yêu cầu cụ thể của ứng dụng.
WHERE genres LIKE '%i:1%'
sẽ trả về cả các record có chứa i:1, i:11, i:123, hay i:154353
Nếu lưu ở dạng csv với 2 dấu "," ở đầu và cuối, câu lệnh có thể viết lại thành:
WHERE genres LIKE '%,1,%'
mà ko sợ query cả các record ko mong muốn.
user_id , genres
1 - i:1,i:2,i:3 , 2 - i:1,i:3
Theo mình bạn không nên viết kiểu này sau này xử lý rất mệt, tốt nhất chuẩn hóa tách tiếp table này ra làm 2 table. Tối kị kiểu viết này. Join nhiều bảng tí có vấn đề gì đâu.
Do bạn chưa normalize table genres nên bạn mới khó khăn trong query. Bạn tách ra rồi join lại xem query trên rất đơn giản.
ở đây mình cần làm 1 dạng như phân trang kiểu show more trên facebook. nghĩa là cứ mỗi lần click "show more" thì sẽ hiện ra 1 lượng tin mới nữa.
cái khó là mỗi lần click "show more" phải truy xuất ra đươc đủ 1 số lượng tin đã định sẵn . ví dụ mỗi lần click show more friends , thì phải show ra đủ 10 friends đạt đủ điều kiện là "friend" và có cùng genre đã chọn.
với kiểu query này và những cách thông thường với 2-3 query thì sẽ lấy được 10 friends nhưng trong 10 friend này ko đảm bảo là có genre như yêu cầu. nên kết quả trả về có thể chỉ còn ít hơn .
ai có cao kiến về vụ này giúp mình với?