У меня есть эта система, которая отслеживает местоположение предметов.
Примеры таблиц:
constb
consid cons
1 Nint
2 PS
3 XB
4 AT
consloctb
locid consid loc
1 1 GS
2 2 IT
3 2 GG
4 1 IG
5 2 SS
6 3 SM
7 3 FB
8 1 SS
9 2 SM
10 3 IT
11 4 SM
И результат покажет текущее местоположение всех предметов. Это будет выглядеть так:
Nint - SS
PS - SM
XB - IT
Логика, о которой я сейчас думаю, — это сделать вложенный цикл.
$res=mysqli_query($con,"SELECT * FROM constb ORDER BY id");
while($row=mysqli_fetch_array($res)){
$consid=$row["consid"];
$res2=mysqli_query($con,"SELECT * FROM consloctb WHERE consid='$consid' ORDER BY locid DESC LIMIT 1");
while($row2=mysqli_fetch_array($res2)){
echo $row["cons"]." - ".$row2["loc"];
} /* END OF SECOND LOOP */
} /* END OF FIRST LOOP */
Это покажет результаты, которые я хотел.
И если бы я добавил функцию поиска, я бы сделал тот же процесс вложенного цикла, просто добавив еще одно условие WHERE во второй цикл, если искомое местоположение совпадает с loc
колонка.
$srchloc=$_POST["search"]; /* DATA SUBMITTED */
$res=mysqli_query($con,"SELECT * FROM constb ORDER BY id");
while($row=mysqli_fetch_array($res)){
$consid=$row["consid"];
$res2=mysqli_query($con,"SELECT * FROM consloctb WHERE consid='$consid' AND loc='$srchloc' ORDER BY locid DESC LIMIT 1");
while($row2=mysqli_fetch_array($res2)){
echo $row["cons"]." - ".$row2["loc"];
} /* END OF SECOND LOOP */
} /* END OF FIRST LOOP */
Пример поиска, если пользователь ищет элементы, которые в данный момент находятся в SM
результат покажет
PS - SM
AT - SM
Выполнение второго варианта, я думаю, может замедлить процесс поиска. Как я могу добиться этого с помощью одного запроса? Или сделать процесс быстрее?
Если вы хотите указать текущее местоположение всех предметов:
SELECT t.cons,
t.loc
FROM
(SELECT constb.consid AS id,
constb.cons AS cons,
consloctb.loc AS loc
FROM constb
LEFT JOIN consloctb ON constb.consid = consloctb.consid
ORDER BY constb.consid,
consloctb.locid DESC) AS t
GROUP BY t.id;
Если вы хотите, чтобы результат был отфильтрован для искомого местоположения, Вы можете добавить HAVING
пункт:
SELECT t.cons,
t.loc
FROM
(SELECT constb.consid AS id,
constb.cons AS cons,
consloctb.loc AS loc
FROM constb
LEFT JOIN consloctb ON constb.consid = consloctb.consid
ORDER BY constb.consid,
consloctb.locid DESC) AS t
GROUP BY t.id HAVING t.loc='SM';
Других решений пока нет …