2013-02-22 151 views
0

我有这个疑问MySQL查询使用子查询两次

SELECT itemID, locationParentID, locationID, categoryParentID, categoryID, itemTitle, itemDetails, itemAttributes, itemPictures, itemFeatured, itemSpotlight, itemAdded 
FROM items 
WHERE locationID NOT IN 
    (SELECT locationID 
    FROM sites_locations 
    WHERE siteID != 2) AND items.siteID IN('1,2') AND itemStatus = '1' 
    AND itemAdded > '1356048000' 

,它工作正常,但是当我执行此查询失败

SELECT itemID, locationParentID, locationID, categoryParentID, categoryID, 
itemTitle, itemDetails, itemAttributes, itemPictures, itemFeatured, itemSpotlight, itemAdded FROM items 
WHERE locationID NOT IN 
    (SELECT locationID 
    FROM sites_locations WHERE siteID != 2) 
    AND categoryID NOT IN (SELECT categoryID FROM sites_categories 
    WHERE siteID != 2) AND items.siteID IN('1,2') AND itemStatus = '1' 
    AND itemAdded > '1356048000' 

这里的区别是我加入的条款

AND categoryID NOT IN(SELECT categoryID FROM sites_categories 
WHERE siteID != ".$cfg['site']['siteID'].") 

任何想法,为什么这不起作用?

甚至更​​好,加入查询来帮助优化它。对于sites_categories

表结构中,数据以 enter image description here

物品表结构,数据是在 enter image description here

表结构sites_locations enter image description here

为位置表结构,数据是在 enter image description here

在此先感谢。

+0

什么是不工作相关的一些错误或列名? – 2013-02-22 03:10:18

+0

你能不能替换内部加入] – 2013-02-22 03:12:38

+0

我不知道如何 – 2013-02-22 03:13:02

回答

1

试试这个

SELECT i.itemID, i.locationParentID, i.locationID, i.categoryParentID, i.categoryID, 
i.itemTitle, i.itemDetails, i.itemAttributes, i.itemPictures, i.itemFeatured, i.itemSpotlight, i.itemAdded 
FROM items i, sites_locations sl, sites_categories sc 
WHERE i.locationID = sl.locationID 
AND i.categoryID = sc.categoryID 
AND i.siteID = 1 AND i.itemStatus = '1' 
AND i.itemAdded > '1356048000' 

它可能有错误的PL纠正这些错误

+0

@IanWilkinson您已保存您的$ 20;): P – Meherzad 2013-02-22 04:23:34

0

你可以把它变成像加入这样:

SELECT i.itemID, i.locationParentID, i.locationID, i.categoryParentID, i.categoryID, 
     i.itemTitle, i.itemDetails, i.itemAttributes, i.itemPictures, i.itemFeatured, 
     i.itemSpotlight, i.itemAdded 
FROM items i left outer join 
    sites_locations sl 
    on i.locationID = sl.locationId and sl.siteId <> 2 left outer join 
    sites_categories sc 
    on i.categoryID = sc.categoryId and sc.siteId <> 2 
WHERE sl.locationID is NULL and sc.categoryId is NULL and 
     i.siteID IN (1, 2) AND i.itemStatus = 1 AND i.itemAdded > 1356048000 

这也可能有较好表现。

注意:我没有测试过这个SQL,因此它可能有语法错误。特别是,您可能需要在某些列名之前添加别名(最好在列名之前始终使用别名)。

+0

没有,仍然没有工作,我会弄乱它,看看我能否得到它,如果我得到它与您的代码工作我是一个我的话,20美元将标题你的方式:) – 2013-02-22 03:29:13

+0

解决方案SELECT itemID,locationParentID,locationID,categoryParentID,categoryID,itemTitle,itemDetails,itemAttributes,itemPictures,itemFeatured,itemSpotlight,itemAdded从项目WHERE items.siteID IN('1,2')AND items.locationID =(SELECT locationID FROM sites_locations sl WHERE sl.locationID = items.locationID AND siteID ='2')AND items.categoryID =(选择categoryID FROM sites_categories sc WHERE sc.categoryID = items.categoryID AND siteID ='2')AND itemStatus ='1'且itemAdded>'1356048000'ORDER BY itemID DESC LIMIT 15 – 2013-02-22 03:53:25

0

解决

SELECT itemID, locationParentID, locationID, categoryParentID, categoryID, itemTitle, itemDetails, itemAttributes, itemPictures, itemFeatured, itemSpotlight, itemAdded FROM items WHERE items.siteID IN('1,2') AND items.locationID = (SELECT locationID FROM sites_locations sl WHERE sl.locationID = items.locationID AND siteID = '2') AND items.categoryID = (SELECT categoryID FROM sites_categories sc WHERE sc.categoryID = items.categoryID AND siteID = '2') AND itemStatus = '1' AND itemAdded > '1356048000' ORDER BY itemID DESC LIMIT 15