2016-11-19 46 views
0

我写了一些sql语句,并且有一定的问题。SQL的错误,因为以后凡在

SELECT uri, k.score_x 
    FROM uris 
    WHERE id IN (
    SELECT id, SUM(x) AS score_x 
     FROM keywords 
     WHERE key = 'key1' OR 
     key='key2' OR 
     key='key3' OR 
     key='key4' 
     GROUP BY id 
     HAVING COUNT(key) = 4 
) AS k 
    ORDER BY k.score_sum DESC; 

这是我的发言,但我的数据库(PostgreSQL的),说有一个语法错误与我的“AS”。

但是北京时间问题? o.O我不明白

+2

你不能当'IN()'子句中定义的别名的子查询。并且您的子查询返回多个列 –

+1

要添加到juergen的答案,您必须在子查询上使用JOIN来完成您试图实现的任务。 – coladict

回答

0

你需要一个连接,如:

SELECT 
    uri, 
    sum(k.x) as score_x 
FROM uris u 
JOIN keywords k 
ON u.id = k.id 
WHERE k.key in ('key1', 'key2', 'key3', 'key4') 
ORDER BY score_x DESC; 

不知道你试图用HAVING COUNT(键)= 4来表达,虽然。

0

你似乎想是这样的:

SELECT u.uri, k.score_x 
FROM uris u JOIN 
    (SELECT id, SUM(x) AS score_x 
     FROM keywords 
     WHERE k.key in ('key1', 'key2', 'key3', 'key4') 
     GROUP BY id 
     HAVING COUNT(DISTINCT key) = 4 
    ) k 
    ON u.id = k.id 
ORDER BY k.score_sum DESC; 
+0

如果没有JOIN,没有办法做到这一点吗?是否可以按子查询的表进行分组,但在顶级查询中执行此操作。因为子查询中的order by不起作用。 – RayRayRay

+0

@RayRayRay。 。 。我不明白你的评论。在这个答案中,在子查询中没有'order by'。 –