Один запрос в системе отслеживания местоположения

У меня есть эта система, которая отслеживает местоположение предметов.

Примеры таблиц:

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

Выполнение второго варианта, я думаю, может замедлить процесс поиска. Как я могу добиться этого с помощью одного запроса? Или сделать процесс быстрее?

2

Решение

Если вы хотите указать текущее местоположение всех предметов:

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';
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]