2013-11-26 60 views
2

我有这个查询在MYSQL中工作,但不会在SQLite中运行。我认为它由于WHERE子句中的多个参数而失败。SQLite在WHERE中传递多个参数

目的是为所有调查问题(sqid)选择唯一的最新调查答案(表示),因为对问题的多个答案是可能的。

SELECT sqid, said, saname, satimestamp 
FROM surveyanswer 
WHERE (sqid, hoid, satimestamp) IN (
    SELECT sqid, hoid, max(satimestamp) as satimestamp 
    FROM surveyanswer 
    GROUP BY sqid 
) 

我已经被satimestamp与订货试验和选择的一个,而不是最大的限制,但不能得到它的工作。

+0

即使SQLite的会支持你的元组比较仍由于“非法”使用“GROUP BY”,因此在您的子选择中出现错误:http://www.mysqlperformanceblog.com/2006/09/06/wrong-group-by-makes-your-queries-脆弱/ –

回答

2

你可以做到这一点联接:

SELECT sqid, said, saname, satimestamp 
FROM surveyanswer A 
JOIN (
    SELECT sqid, hoid, max(satimestamp) as satimestamp 
    FROM surveyanswer 
    GROUP BY sqid 
) B ON A.sqid = B.sqid and A.hoid = B.hoid and A.satimestamp = B.satimestamp 

在功能上像你原来的SQL但因为你只关心时间,我相信这也能发挥作用:

SELECT sqid, said, saname, satimestamp 
FROM surveyanswer A 
JOIN (
    SELECT max(satimestamp) as satimestamp 
    FROM surveyanswer 
) B ON A.satimestamp = B.satimestamp 
2

一点也没有看起来你没有使用hoid这个字段。所以,我删除了它。执行以下操作产生你在找什么:

SELECT sa.sqid, sa.said, sa.saname, sa.satimestamp 
FROM surveyanswer sa 
WHERE sa.satimestamp IN (
    SELECT max(subsa.satimestamp) 
    FROM surveyanswer subsa 
    WHERE sa.sqid = subsa.sqid 
) 

如果hoid领域需要包含在where子句中,然后尝试以下方法:

SELECT sa.sqid, sa.said, sa.saname, sa.satimestamp 
FROM surveyanswer sa 
WHERE sa.satimestamp IN (
    SELECT max(subsa.satimestamp) 
    FROM surveyanswer subsa 
    WHERE sa.sqid = subsa.sqid 
    AND sa.hoid = subsa.hoid 
)