gpt4 book ai didi

php - 如何一次匹配两个表中的记录

转载 作者:行者123 更新时间:2023-11-29 19:41:51 25 4
gpt4 key购买 nike

This is the Match Table I'm trying to achieve我有一个问题正在尝试解决。请帮忙。提前致谢。

场景:数据库中有三个表。比方说 tblA、tblB 和 tblC。它适用于服务交换类型的场景。因此,tblA 包含请求服务的人员的记录,tblB 包含提供服务的人员的记录。因此,tblB 应该与在同一可用时间请求相同服务的人进行匹配,并将匹配记录放入 tblC 中。

我已经完成/尝试过的事情:我已经能够创建一个查询以在两个表之间发生匹配,这是一个很好的进步。但这给我带来了一个大问题。

问题:问题是基于我所做的,查询将一个人的请求与多个人的产品相匹配。我希望它一旦将 tblA 中的记录与 tblB 中的某人匹配并将其放入 tblC 中,它应该立即删除,以便它不会将这些记录与其他人匹配。

示例代码:

    $match = "SELECT * FROM tblmatch";
$Resmatch = mysql_query($match, $localhost) or die(mysql_error());
$row_match = mysql_fetch_assoc($Resmatch);
$mat_offuemail = $row_match['useremail'];
$mat_offustype = $row_match['stype'];
$mat_offtrange = $row_match['trange'];

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "request-form")) {
$insertSQL = sprintf("INSERT INTO tblrequest (orderid, useremail, catname, rdate, stype, trange, rdesc, rloc) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)",
GetSQLValueString($_POST['uorder'], "text"),
GetSQLValueString($_POST['uemail'], "text"),
GetSQLValueString($_POST['rcat'], "text"),
GetSQLValueString($_POST['date'], "text"),
GetSQLValueString($_POST['serv'], "text"),
GetSQLValueString($_POST['trange'], "text"),
GetSQLValueString($_POST['rdesc'], "text"),
GetSQLValueString($_POST['rloc'], "text"));

If ($_POST['uemail'] == $mat_offuemail AND $_POST['serv'] == $mat_offustype AND $_POST['trange'] == $mat_offtrange){
echo "Match Done Previously";
}
else{
$inmatch = "INSERT INTO tblmatch (useremail, userorder, stype, uemail, uorder, trange)
SELECT tbloffer.useremail, tbloffer.orderid, tbloffer.stype, tblrequest.useremail, tblrequest.orderid, tbloffer.trange
FROM tbloffer
INNER JOIN tblrequest
ON tbloffer.stype = tblrequest.stype
AND tbloffer.trange = tblrequest.trange
WHERE tbloffer.useremail != tblrequest.useremail
AND tbloffer.catname != tblrequest.catname
ORDER BY tbloffer.useremail
LIMIT 1";
}

mysql_select_db($database_localhost, $localhost);
$Result1 = mysql_query($insertSQL, $localhost) or die(mysql_error());
$Result2 = mysql_query($inmatch, $localhost) or die(mysql_error());

$insertGoTo = "match.php";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}

最佳答案

为了仅匹配一个报价,我们可以使用子查询和 GROUP BY 子句。我假设 orderid 是唯一的,并且可以用作主键来仅选择一个匹配的报价(如果有多个匹配报价)。通过 orderid 上的 MIN 函数,我总是选择 ID 号最小的函数,但任何其他聚合函数也可以正常工作(例如 MAX)。

这是完整的 SELECT 语句:

SELECT tbloffer.useremail, tbloffer.orderid, tbloffer.stype, tblrequest.useremail, tblrequest.orderid, tbloffer.trange
FROM tbloffer
JOIN tblrequest
ON tbloffer.stype = tblrequest.stype
AND tbloffer.trange = tblrequest.trange
WHERE tbloffer.useremail != tblrequest.useremail
AND tbloffer.catname != tblrequest.catname
AND tbloffer.orderid IN (
SELECT min(orderid)
FROM tbloffer
GROUP BY stype, trange
)

我再次建议评估您是否可以使用 View 而不是通过 PHP 脚本插入匹配的行。根据上述 SQL 语句可以轻松创建 View 并替代脚本。

关于php - 如何一次匹配两个表中的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41303769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com