0

我有 3 张桌子

图片

    id , name 
    1  , abc

图像标签

    id , image_id , tag
    1  , 1345     , football
    2  , 1345     , sport
    3  , 1666     , football 

图像类别

    id , image_id , cat

    1  , 1345     , 7
    2  , 1345     , 3
    3  , 1666     , 8

在我的查询中,我有一组标签,我想获得类似的图像

这很容易(我只是写了这个,请不要提及语法错误)

select distinct(image_tags.image_id) , images.* from 
image_tags join images on image_tags.image_id = images.id 
where image_tags.tag IN (implode(',' , $tag_Array )) limit 10

但这是棘手的部分,我不想要类别 3 的图像!如何在同一查询中过滤类别 3 的图像?

4

1 回答 1

1

JOIN该表image_categories然后您可以按类别过滤cat

SELECT DISTINCT 
  it.image_id, 
  i.* 
FROM image_tags AS it
INNER JOIN images           AS i ON it.image_id = i.id 
INNER JOIN image_categories AS c ON c.image_id  = i.id
WHERE it.tag IN (implode(',' , $tag_Array )) 
  AND c.cat <> 3
LIMIT 10;

在这里查看它的实际效果:


更新

使用NOT IN谓词 or LEFT JOIN

Select distinct 
  it.image_id,
  i.* 
from image_tags AS it
INNER JOIN images           AS i ON it.image_id = i.id 
WHERE it.tag IN (implode(',' , $tag_Array ))
  AND it.image_id NOT IN(SELECT image_id 
                         FROM image_categories
                         WHERE image_id <> 3
                           AND image_id IS NOT NULL)
  limit 10;

在这里查看它的实际效果:

于 2013-05-23T06:43:23.383 回答