不要带一排桌子

时间:2011-12-28 12:44:57

标签: mysql sql categories

好吧,让我们去做生意......

说我有一个类别(categoyid)'150',并且不会带来该类别中的任何内容......

事实证明,一篇文章可能属于多个类别,而且我在SELECT类别中阻止了150,它仍然会链接到其他类别....

我该怎么做,以便在SELECT中不寻找类别'150'中的任何项目,即使他还在'150'以外的其他类别......

表:

node

nodeid
contentid
url
publishdate

nodeinfo

nodeid
title

node_category

categoryid
nodeid

article

contentid
previewimage

===================== 我试过了:

SELECT p.nodeid, p.contentid p.publishdate, p.url, c.categoryid, c.nodeid, a.previewimage, a.contentid, e.title FROM `node` AS p 
INNER JOIN `nodecategory` AS c ON p.`nodeid` = c.`nodeid` 
INNER JOIN `article` AS a ON p.`contentid` = a.`contentid` 
INNER JOIN `nodeinfo` AS e ON p.`nodeid` = e.`nodeid` 
WHERE c.`categoryid` 
IN (73,74,77,105,71,70,72,76,100,80,79,78,81,108,145,146,82,142,83,97,153) 
GROUP BY c.nodeid 
ORDER BY p.`publishdate` 
DESC LIMIT 4

1 个答案:

答案 0 :(得分:1)

我认为你需要一个not-exists子句:

 AND NOT EXISTS (
  SELECT 1
  FROM 
   `nodecategory` AS ic
  WHERE
   p.`nodeid` = ic.`nodeid`
   AND ic.`categoryid` IN (150)
 )

这是在你的查询中,重新格式化了一下:

SELECT 
 p.nodeid, 
 p.contentid,
 p.publishdate, 
 p.url, 
 c.categoryid, 
 c.nodeid, 
 a.previewimage, 
 a.contentid, 
 e.title 
FROM 
 `node` AS p 
 INNER JOIN `nodecategory` AS c ON p.`nodeid` = c.`nodeid` 
 INNER JOIN `article` AS a ON p.`contentid` = a.`contentid` 
 INNER JOIN `nodeinfo` AS e ON p.`nodeid` = e.`nodeid` 
WHERE c.`categoryid` 
 IN (73,74,77,105,71,70,72,76,100,80,79,78,81,108,145,146,82,142,83,97,153) 
 AND NOT EXISTS (
  SELECT 1
  FROM 
   `nodecategory` AS ic
  WHERE
   p.`nodeid` = ic.`nodeid`
   AND ic.`categoryid` IN (150)
 )
GROUP BY c.nodeid 
ORDER BY p.`publishdate` 
DESC LIMIT 4

这应该过滤掉所选类别之一中的节点,但不属于not-exists子句中指定的节点。