Это таблица соответствий, которую я пытаюсь достичь У меня проблема, которую я пытаюсь решить. Пожалуйста, помогите. Заранее спасибо.
Сценарий. В базе данных есть три таблицы. Скажем, 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 ответ
Чтобы сопоставить только одно предложение, мы можем использовать подзапрос и предложение 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 и работать вместо вашего скрипта.
Похожие вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.
mysqli
.mysql
устарел. б) не лучше ли было бы создать представление, содержащее совпадающие строки, вместо того, чтобы вставлять их в новую таблицу?