我做了一个webapplication,在localhost上测试它完美无缺。将它放在我的服务器上,在查询中的GROUP BY
上,它会在控制台中输出一个空500 internal server error
的空白屏幕。
$sth = $db->prepare('SELECT users.username FROM users INNER JOIN questions ON users.question_id=questions.id WHERE questions.question_list_pass = "'.$ww.'" GROUP BY users.username ORDER BY users.username');
$sth->execute();
$usernames = $sth->fetchAll(PDO::FETCH_ASSOC);
$sth = $db->prepare('SELECT questions.id, questions.question_name FROM
questions INNER JOIN users ON users.question_id=questions.id WHERE questions.question_list_pass = "'.$ww.'" GROUP BY questions.question_name ORDER BY questions.question_name');
$sth->execute();
$question_names = $sth->fetchAll(PDO::FETCH_ASSOC);
第一个查询与从第二个exept获取来自不同表的数据相同。当我运行脚本时,它会输出500 internal server error
,当我从第二个查询中移除 GROUP BY questions.question_name
时(但仍按顺序排列)脚本可以正常工作但它会输出多个次(因为订单不会正常工作)
任何想法如何可能?我让不同的人看着它,但没有人知道什么是不正确的。
亲切的问候,
答案 0 :(得分:0)
如果没有聚合,为什么还需要一个组?实际上只有在聚合时才需要GROUP BY
。
为什么首先需要加入?连接本身似乎导致记录重复,因此通过消除它,我们摆脱了不同的需要。在第二个查询中,您似乎不需要来自用户的任何内容,除非它限制与用户相关的问题....存在会更有效地执行。
如果您有重复的问题/结果并想要不同的记录,请使用DISTINCT
。
通过相关子查询使用存在似乎更有效地消除导致明显重复的连接。你可以添加一个不同的,但这似乎......更清晰......现在,如果你有特定于用户的附加where子句标准,或者还需要在结果中显示用户信息;然后一个独特的可能会更有意义。
SELECT Q.id, Q.question_name
FROM questions Q
WHERE Q.question_list_pass = "'.$ww.'"
and exists (SELECT 1
FROM users U
WHERE U.Question_ID = Q.Questions_ID)
ORDER BY Q.question_name`