复杂连接的SQL查询

问题描述:

我想让用户对徽标进行评分。该查询应选择该用户尚未评分的下一个徽标。复杂连接的SQL查询

在review.php我们选择一个标志:

<?php 
$dbconnect = mysqli_connect("localhost", "***", "***", "***"); 
if (!isset($_SESSION)) { 
session_start(); 
} 
$thisuser = $_SESSION['uid'] 

$Recordsetlogos = mysqli_query($dbconnect, "SELECT * FROM tbllogos WHERE status = 'live' LIMIT 1"); //query 
$row_Recordsetlogos = mysqli_fetch_assoc($Recordsetlogos); 
?> 

到目前为止好。

用户看到徽标,选择评分并提交表格。

在我们收集的形式向用户填写的数据下一个页面,我们插入一条记录到数据库中的另一个表:

<?php 
$dbconnect = mysqli_connect("localhost", "***", "***", "***"); 

$did = $_POST['did']; // user ID 
$lid = $_POST['lid']; // logo ID 
$review = $_POST['review']; // rating 
$desrank = $_POST['desrank']; // user's rank 

$updateSQL = mysqli_query($dbconnect, "INSERT INTO tblreviews (did, lid, vote, desrank) VALUES ('$did', '$lid', '$review', '$desrank')"); 

mysqli_close($dbconnect); 

header("Location: review.php"); // send user back 
exit; 

用户到达回到review.php,进行评分下一个标志。

当review.php加载时,它显示与用户刚刚评分相同的徽标。

我意识到这可能是一个简单的连接,但我无法绕开它。

下面是它应该做的,在英文...

Select from tbllogos 
where status = 'live' 
AND 
logo and $thisuser do not appear as a pair in tblreviews. 

感谢您的帮助!

您需要一个LEFT JOIN在您的选择查询和筛选WHERE只有没有连接行的行。

SELECT l.* FROM tbllogos l 
LEFT JOIN tblreviews r ON r.lid = l.id AND r.did = $thisuser 
WHERE l.status = 'live' AND r.lid IS NULL 
LIMIT 1 

我假设有一列tbllogos.id作为主键。如果以其他方式命名,则当然需要修改查询。

该查询说“选择没有审查该用户做出标识”

+0

工程就像一个魅力。非常感谢你。如果能够解决这个问题,我会在今天剩下的时间里解决这个问题。 – blogo

+0

是的,tbllogos.id作为主键。 – blogo

+0

请注意,没有ORDER BY的LIMIT是相当无意义的 – Strawberry

你的意思是“在接下来的页面,我们收集的形式向用户填写的数据,并允许他进行我们的数据库的SQL注入攻击”

留下一旁的时刻,看看你第一查询

"SELECT * FROM tbllogos WHERE status = 'live' LIMIT 1" 

现在看看你插入

INSERT INTO tblreviews (did, lid, vote, desrank) VALUES ('$did', '$lid', '$review', '$desrank')"); 

两个表是不同的。除非tblreviews表中有触发器,否则tbllogos中任何记录的状态都不会改变。

修复:在tbllogos表中进行更新。

UPDATE tbllogos set status = 'dead' where id = ? 

还要注意,您正在重定向用户而不检查插入是否成功。

+0

非常感谢@ e4c5我发送到数据库之前有点消毒它。对不起,我知道我应该显示所有代码,但我想将问题保持在可消化的大小。我会在重定向之前检查插入是否成功,谢谢提醒。 – blogo