Mysql OR / AND查询

时间:2016-06-07 16:05:30

标签: mysql

我用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)

我希望我很清楚,抱歉我的英语不流利。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您可以使用group byhaving(或其他方法)执行此操作。更重要的是,学会使用正确的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中满足两个连接条件的行才会在结果集中返回,这是我认为你想要的。