2013-02-16 62 views
0

我有一个工作得很好的查询。让我从它开始:向SQL中的查询添加子查询

编辑: SQL已更新。我每行都得到0

SELECT i.item, i.user_id, u.username, 
     (COALESCE(r.ratetotal, 0)) AS total, 
     (COALESCE(c.commtotal, 0)) AS comments, 
     (COALESCE(r.rateav, '50%')) AS rate, 
     (COALESCE(x.wasRated, '0')) AS wasRated 
     FROM items AS i 
     LEFT JOIN master_cat AS c 
      ON (c.cat_id = i.cat_id) 
     LEFT JOIN users AS u 
     ON u.user_id = i.user_id  
     LEFT JOIN 
      (SELECT item_id, 
      COUNT(item_id) AS ratetotal, 
      AVG(rating) AS rateav 
      FROM ratings GROUP BY item_id) AS r 
     ON r.item_id = i.item_id 
     LEFT JOIN 
      (SELECT item_id, 
      COUNT(item_id) AS commtotal 
      FROM reviews GROUP BY item_id) AS c 
     ON c.item_id = i.item_id 
     LEFT JOIN 
      (SELECT xu.user_id, ra.item_id, '1' AS wasRated 
      FROM users AS xu 
      LEFT JOIN ratings AS ra 
       ON ra.user_id = xu.user_id 
      WHERE xu.user_id = '1') AS x 
     ON x.user_id = u.user_id 
       AND x.item_id = r.item_id 
     WHERE c.category = 'Movies' 
     ORDER by i.item ASC; 

我需要一个更多的功能添加到它,在那里你看到AS x

基本上,这里有三个表是很重要的。 items,reviewsratings。在顶部,您会看到有子查询正在统计诸如每个项目的平均值和总计。

我需要一个连接到user_id,item_idrate_id(在ratings)的最终查询。在最终的结果中,它列出了每个项目和统计数据,我想再列一个列,如果登录用户对它进行了评分,那么这个列是简单的true或false。所以,我需要的是这样的:

SELECT ??? 
FROM ratings AS r 
WHERE r.user_id = '{$user_id}' 

(的登录用户user_id从PHP.`传递)

我怎样才能使一个子查询,让我的信息的最后一点,但把它在父查询中的每一行项目?

+0

如果您发布表的SQL DDL以及一些SQL INSERT语句,您可能会得到更多的回复。 – 2013-02-16 22:33:26

回答

1

将此添加到父查询中。

, coalesce(x.WasRated, 'false') as WasRated 

你的X子查询:

(select users.user_id 
, ratings.item_id 
, 'true' WasRated 
from users join ratings on user.user_id = ratings.user_id 
where users.user_id = the one for the logged in user 
) x on x.user_id = users.user_id 
and x.item_id = ratings.item_id 

或类似的东西。

+0

我已根据您的提交更新了我的代码,并且还包含了结果。有什么想法吗? – KickingLettuce 2013-02-17 02:56:20

+1

我的建议是从用户到子查询中的评分进行内部连接。你有一个左连接。我的意图是,如果用户评价一个项目,子查询将返回“真”。主查询中的coalesce函数如果没有,则会将其更改为false。在子查询中加入左连接将使其对每个用户都返回true。 – 2013-02-17 03:59:15

+0

我只是将它改为内连接,并做了一些非常小的调整,并使其工作!标记正确,谢谢! – KickingLettuce 2013-02-18 18:52:09