Cần chỉ giáo câu truy vấn 2 bảng dưới đây

sql
mysql

(Minh Hải) #1

Chào mọi người tình hình là em đang mắc câu truy vấn mò cả ngày không ra nôm na là kết hợp Inner join bảng 1 và bảng 2 sau đó check điều kiện, nay mạn phép lên hỏi các bậc tiền bối ạ về keyword ạ.

CSDL của em gồm 2 bảng: post và post_meta

Bảng post:
ID
Bảng post_meta:
post_id
post_key
post_value

Bây giờ em muốn Inner join bảng 1(post) sang bảng 2(post_meta)
và lấy ra row với điều kiện tại Row với giá trị post_key = A nếu giá trị tại post_value LIKE %B% thì sẽ trả về kết quả.

Vấn đề là có rất nhiều post_id có cùng ID ở bên bảng 1 vì thế khi em query câu dưới đây thì kết quả trả về sẽ không chính xác:

SELECT post.ID
FROM post
INNER JOIN post_meta ON post.ID = post_meta.post_id 
WHERE post_meta.post_key = 'A' AND post_value LIKE '%B%'

Không chính xác bởi vì có rất nhiều row với post_key và post_value khác nhau cùng thuộc 1 ID
Vậy các tiền bối cho em hỏi có cách nào inner join và kiểm tra tại bảng thứ 2 rằng, nếu tồn tại 1 row mà trong row đó có post_key = Apost_value Like B thì mới trả về. (Ràng buộc 2 điều kiện phải trên cùng 1 row)

EM xin cảm ơn mọi người rất nhiều ạ. Mong mọi người giúp đỡ.


(rogp10) #2

Bạn đưa hết vào điều kiện kết xem sao.

SELECT post.ID
FROM post
INNER JOIN post_meta ON post.ID = post_meta.post_id
AND post_meta.post_key = ‘A’ AND post_meta.post_value LIKE ‘%B%’

(oops :smiley: inner join thì điều kiện on hay where là như nhau)


(Minh Hải) #3

sẽ không đúng bác ơi vì như thế nó sẽ check tất cả các trường hợp riêng lẻ của từng column


bác để ý ảnh nếu ví dụ cải deadpool kia nó nằm ở khác Row ten_khac thì nếu check như trên của bác nó sẽ vẫn trả về kết quả bởi vì, key có tồn tại tên khác, và value có tồn tại deadpool
Cái em muốn là ràng buộc cái row nào có tên khác và lấy value của key đó để so sánh có chưa từ deadpook hay ko ấy ạ
E giải thích hơi khó hiểu, bác có hiểu ko ạ :smiley:


(rogp10) #4

À, ý bạn là mỗi ID chỉ được xuất hiện một lần trong kq?

Chứ điều kiện đó là cho từng dòng mà.


(‏) #5

ko hiểu câu hỏi thử select distinct xem :V


(Hung) #6

Bạn đưa vài dòng data của 2 bảng lên, rồi kết quả trả về mong muốn là gì sẽ dễ hơn, chứ yêu cầu mơ hồ quá.


(rogp10) #7

Như thế này chẳng hạn :smiley: http://sqlfiddle.com/#!9/a6c585/1


(Bò Lúc Lắc) #8

Bạn nên soạn lại cách hỏi sao cho mọi người dễ hiểu nhất, vd bằng data đi, mọi người chưa giúp được bạn vì câu hỏi quá khó hiểu


(Xanh Tuyen Dung) #9
SELECT post_id,post_key,post_value
FROM post_meta m
LEFT JOIN post  p ON m.post_id=p.ID
WHERE post_key = 'A' AND post_value LIKE '%B%'

post_id có 1 row là A01
ID ở bảng post có 2 row A01
Thì nó sẽ ra 2 row. còn nếu ở bảng post chỉ có 1 A01 thì ra 1 row


(Hai Lúa) #10

Khai quật bài này từ mấy năm trước :slight_smile:

Vấn đề của bạn đó là dữ liệu có nhiều dòng cùng 1 ID, khi so sánh thì điều kiện 1 thỏa dòng A, điều kiện 2 thỏa dòng B, nên 2 dòng A, B điều ra hết.

Giờ muốn cà 2 điều kiện cùng so sánh chung trên 1 dòng thì cộng nó lại, để chắc chắc ko bị so nhầm, thì nên cộng thêm ký tự x nào đó vào: (sửa lại toán tử cộng chuổi với csdl mà bạn đang dùng)

WHERE post_key+‘x’+post_value LIKE ‘Ax%B%’


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?