繁体   English   中英

具有复杂联接的SQL查询

[英]SQL query with complex join

我想允许用户对徽标进行评分。 查询应选择该用户尚未评级的下一个徽标。

在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作为主键。 如果以其他方式命名,则您当然需要修改查询。

该查询显示“选择没有对此用户进行评论的徽标”

您的意思是“在下一页上,我们将从用户填写的表单中收集数据,并允许他对我们的数据库进行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 = ?

另请注意,您在重定向用户时未检查插入是否成功。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM