Это таблица соответствий, которую я пытаюсь достичь У меня проблема, которую я пытаюсь решить. Пожалуйста, помогите. Заранее спасибо.

Сценарий. В базе данных есть три таблицы. Скажем, 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));
    }
0
ogo 23 Дек 2016 в 18:08
2
Два комментария а) Было бы лучше использовать mysqli. mysql устарел. б) не лучше ли было бы создать представление, содержащее совпадающие строки, вместо того, чтобы вставлять их в новую таблицу?
 – 
Erik Kalkoken
23 Дек 2016 в 18:14
Было бы полезно, если бы вы могли добавить таблицу def для таблицы A и таблицы B и способы их сопоставления.
 – 
Erik Kalkoken
23 Дек 2016 в 18:19
А как насчет добавления нового логического столбца «Соответствует»? так что вам не нужно слишком сильно связываться с логикой таблиц, им по-прежнему предлагаются услуги, уже согласованные, но все же услуги.
 – 
Jacopo
23 Дек 2016 в 18:32
Я все еще учусь, но скоро перейду. Не могли бы вы привести пример создания представления? Я попробую Лимит 1, который вы изначально предложили, чтобы вернуться к вам. Большое тебе спасибо
 – 
ogo
23 Дек 2016 в 20:07
Я не совсем понимаю, что вы имеете в виду. Вы можете объяснить дальше?
 – 
ogo
23 Дек 2016 в 20:08

1 ответ

Лучший ответ

Чтобы сопоставить только одно предложение, мы можем использовать подзапрос и предложение GROUP BY. Я предполагаю, что orderid уникален и может использоваться в качестве первичного ключа для выбора только одного подходящего предложения, если их больше одного. С функцией MIN в orderid я всегда выбираю ту с наименьшим идентификационным номером, но любая другая агрегатная функция будет работать так же хорошо (например, 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
)

Опять же, я предлагаю оценить, можно ли использовать представление вместо вставки совпадающих строк с помощью сценария PHP. Представление может быть легко создано на основе приведенного выше оператора SQL и работать вместо вашего скрипта.

0
Erik Kalkoken 25 Дек 2016 в 20:52
Спасибо за ваш отзыв. Теперь я обновил свой ответ лучшим решением. На этот раз я также протестировал его с образцом базы данных на основе вашего сценария, чтобы убедиться, что он работает.
 – 
Erik Kalkoken
25 Дек 2016 в 20:54