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

时间:2016-12-23 15:08:32

标签: php mysql sql xampp

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));
    }

1 个答案:

答案 0 :(得分:0)

为了只与一个商品匹配,我们可以使用子查询和GROUP BY子句。我假设orderid是唯一的,并且可以用作主键,如果它们不止一个,则只选择一个匹配的商品。使用orderid上的MIN函数,我总是选择ID号最小的函数,但任何其他聚合函数都可以正常工作(例如MAX)。

这是完整的SELECT stmnt:

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
)

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