我用PHP和MySql开发了一个标签系统。网站(表1)与第三个表(表3)中的许多标签(表2)相关联:
表1:
! ----- ! -----------------!
! t1_id ! t1_libelle !
! ----- ! ---------------- !
! 1 ! Site 1 !
! ----- ! ---------------- !
! 2 ! Site 2 !
表2:
! t2_id ! tag !
! ----- ! ----------------!
! 3 ! Référencement !
! ----- ! ----------------!
! 4 ! Linking !
! ----- ! ----------------!
! 5 ! HTML !
表3:
! t1_id ! t2_id !
! ----- ! ----------!
! 1 ! 3 !
! ---- ! ---------- !
! 1 ! 4 !
! ---- ! ---------- !
! 2 ! 4 !
! ---- ! ---------- !
! 2 ! 5 !
我的查询(下方)显示标记为“Référencement”或“链接”的网站,因此会显示网站1和2,但这不是我需要的。我想展示标有'Référencement'和'Linking'两个标签的网站(所以这里只有'网站1'):
SELECT t1.*
FROM table1 t1, table3 t3
WHERE t1.t1_id = t3.t1_id
AND (t3.t2_id = 3 OR t3.t2_id = 4)
我希望我很清楚,抱歉我的英语不流利。
提前感谢您的帮助。
答案 0 :(得分:3)
您可以使用group by
和having
(或其他方法)执行此操作。更重要的是,学会使用正确的join
语法。简单的规则:从不在from
子句中使用逗号。
select t1.* -- this is fine, assuming that `id` is unique in `t1`
from table3 t3 join
table1 t1
on t3.t1_id = t1.id join
table2 t2
on t3.t2_id = t2.id
where t2.tag in ('Référencement', 'Linking')
group by t1.id
having count(*) = 2;
答案 1 :(得分:1)
您需要多次加入表3才能完成您的目标:
SELECT t1.*
FROM table1 t1
JOIN table3 t3_first
ON t1.id = t3_first.t1_id
AND t3_first.t2_id = 3
JOIN table3 t3_second
ON t1.id = t3_second.t1_id
AND t3_second.t2_id = 4
只有table1中满足两个连接条件的行才会在结果集中返回,这是我认为你想要的。