2013-01-04 137 views
3

试图写一个MySQL查询,并有这个很难。mySQL相关子查询

我有两个表(项目:信息有关的项目,并itemReview评论的项目)

我希望做的是选择属于一个特定的位置(这是我的外的所有项目查询一样),然后在外部查询中的每个项目,拿在itemReview表

在这里,所有的评价领域的平均水平是我的尝试:

SELECT 
    Item.idDish, 
    Item.dateAdded, 
    Item.dateModified, 
    Item.fidLocation, 
    Item.category, 
    Item.description, 
    Item.price, 
    Item.name, 
    Item.fullImageName, 
    Item.thumbnailImageName, 
    sub.rating 
FROM Item 
JOIN (
     SELECT 
      AVG(ItemReview.rating) AS rating 
     FROM ItemReview 
     WHERE ItemReview.fidItem = Item.idItem 
    ) AS sub 
WHERE Item.fidLocation = '63'; 

但MySQL的说:未知列“项目。 idItem'in'子句'

任何帮助将非常感谢!谢谢!!

+0

您没有正确加入也没有从项目表中选择itemid –

回答

7

您正试图访问子查询中的Item.idItem,但它在那里不可用。你应该使用这样的事情:

SELECT 
    Item.idDish, 
    Item.dateAdded, 
    Item.dateModified, 
    Item.fidLocation, 
    Item.category, 
    Item.description, 
    Item.price, 
    Item.name, 
    Item.fullImageName, 
    Item.thumbnailImageName, 
    sub.rating 
FROM Item 
JOIN 
(
    SELECT fidItem, AVG(ItemReview.rating) AS rating 
    FROM ItemReview 
    GROUP BY ItemReview.fidItem 
) AS sub 
    ON sub.fidItem = Item.idItem 
WHERE Item.fidLocation = '63'; 
+0

@Eric感谢您的编辑。 – Taryn

+0

非常感谢每个人,这工作! – dbrateris

3

查询:

SELECT 
    Item.idDish, 
    Item.dateAdded, 
    Item.dateModified, 
    Item.fidLocation, 
    Item.category, 
    Item.description, 
    Item.price, 
    Item.name, 
    Item.fullImageName, 
    Item.thumbnailImageName, 
    ( SELECT 
      AVG(ItemReview.rating) AS rating 
     FROM ItemReview 
     WHERE ItemReview.fidItem = Item.idItem 
    ) AS rating 
FROM Item 
WHERE Item.fidLocation = '63' 
+0

我认为这个答案更接近提问者试图做的事情,而且它通常比带有'group by'的解决方案运行得更快。 –

0

试试这个:

SELECT i.idDish, i.dateAdded, i.dateModified, i.fidLocation, i.category, 
     i.description, i.price, i.name, i.fullImageName, 
     i.thumbnailImageName, ir.rating 
FROM Item i 
LEFT JOIN (SELECT fiditem, AVG(ItemReview.rating) AS rating 
      FROM ItemReview 
      GROUP BY fiditem) ir ON ir.fidItem = i.idItem 
WHERE i.fidLocation = '63'; 
0

试试这个

SELECT 
    Item.idDish, 
    Item.dateAdded, 
    Item.dateModified, 
    Item.fidLocation, 
    Item.category, 
    Item.description, 
    Item.price, 
    Item.name, 
    Item.fullImageName, 
    Item.thumbnailImageName, 
    sub.rating, 
    Item.idItem 
FROM Item 
JOIN (
     SELECT 
      AVG(ItemReview.rating) AS rating , 
      fidItem 
     FROM ItemReview 
     GROUP BY fidItem 
    ) AS sub on sub.fidItem = Item.idItem 
WHERE Item.fidLocation = '63'; 
0

您不能引用 “外” 表以这种方式。一种解决方案已经提出bluefeet,另外这也将工作你的情况:

SELECT 
Item.idDish, 
Item.dateAdded, 
Item.dateModified, 
Item.fidLocation, 
Item.category, 
Item.description, 
Item.price, 
Item.name, 
Item.fullImageName, 
Item.thumbnailImageName, 
(SELECT AVG(ItemReview.rating) AS rating 
    FROM ItemReview 
    WHERE ItemReview.fidItem = Item.idItem 
) as rating 
FROM Item 
WHERE Item.fidLocation = '63'; 
0

这个怎么样:

SELECT 
    Item.idDish, 
    Item.dateAdded, 
    Item.dateModified, 
    Item.fidLocation, 
    Item.category, 
    Item.description, 
    Item.price, 
    Item.name, 
    Item.fullImageName, 
    Item.thumbnailImageName, 
    sub.rating 
FROM Item myTable 
JOIN (
     SELECT 
      AVG(ItemReview.rating) AS rating 
     FROM ItemReview 
     WHERE ItemReview.fidItem = myTable.idItem 
    ) AS sub 
WHERE Item.fidLocation = '63'; 

在这里,你是给一个名称,主查询和引用新子查询中的表名。使用原始表名会导致MySQL不知道表所采用的内容。