2016-12-23 37 views
0

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

兩條評論 a)使用'mysqli'會更好。 'mysql'已經過時了。 b)製作一個包含匹配行的視圖,而不是將它們插入到新表中會更好嗎?如果您可以爲表A和表B添加表def以及它們如何匹配,那麼 –

+0

會很有幫助。 –

+0

如何添加一個新的布爾列「匹配」?所以你不必太在意桌子背後的邏輯,他們仍然提供服務,畢竟已經匹配,但仍然是服務。 – Jacopo

回答

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語句可以輕鬆創建視圖,並可用作腳本的替代品。

+0

@ogo感謝您的反饋。我現在用更好的解決方案更新了我的答案。這一次,我還使用基於腳本的示例數據庫對其進行了測試,以確保其正常工作。 –

相關問題