2009-10-17 33 views
0

我正在使用php和sqlite的简单投票系统。我预先构建了一个完整的场景,并在sqlite命令行中进行了测试,它在那里效果很好。 但是一个查询,它应该返回一个投票的所有可能的答案,并投票支持它的用户,不工作了......SQLite子查询不能在PHP中工作

表:

CREATE TABLE polls (
question CHAR(200) 
); 

CREATE TABLE choices (
poll_id INTEGER(5), 
choice_text CHAR(200) 
); 

CREATE TABLE votes (
poll_id INTEGER(5), 
user_id INTEGER(5), 
choice_id INTEGER(5), 
PRIMARY KEY (poll_id, user_id) 
); 

CREATE TABLE users (
name CHAR(100), 
pass CHAR(100), 
session CHAR(100) 
); 

PHP:

$query = "SELECT choices.rowid,choices.choice_text, 
      (SELECT users.name FROM users WHERE votes.user_id=users.rowid) AS name 
     FROM choices,polls LEFT OUTER JOIN votes ON choices.rowid = votes.choice_id 
     WHERE polls.rowid=choices.poll_id AND polls.rowid='$pollid'"; 

$result = $db->arrayQuery($query, SQLITE_ASSOC); 
echo json_encode($result); 

这将返回:

Warning: SQLiteDatabase::arrayQuery() [sqlitedatabase.arrayquery]: no such column: votes.user_id in C:\Users\jan\Eigene Programme\xampplite\htdocs\cattle\vote\update.php on line 122 
false 

我试图在改变的子查询

(SELECT users.name FROM users,votes WHERE votes.user_id=users.rowid) AS name 

这工作,但不会返回相同的结果的第一件事:/ 我修修补补很长与查询,因为我不是专业人士,所以我想这可能会有更好的查询?

回答

2

如果我正确理解您的查询,您可以避免子查询并使用连接。您也不需要从polls中选择。

SELECT 
    choices.rowid, 
    choices.choice_text, 
    users.name 
FROM 
    choices 
    LEFT JOIN votes ON choices.rowid = votes.choice_id 
    LEFT JOIN users ON votes.user_id = users.rowid 
WHERE choices.poll_id = ? 
+0

谢谢,就是这样! (不能相信我的尝试比“专业”解决方案更加丑陋:)) – Jan 2009-10-17 14:09:49

1

为什么使用子查询,如果您已经加入了投票表?您可以将多个连接链接在一起。