Помогите, пож-та, написать запрос в mysql

12
P
На сайте с 06.01.2009
Offline
556
1161

Здравствуйте.

Имеем


$spisokid = "35|7|22|340|104|1456|367|478.....";
$massid=explode("|", $spisokid);

foreach ($massid as $value) {
$result33 = mysql_query("SELECT `id`, `url`, `photo` FROM `katalog` WHERE `id`='$value' ORDER BY `id` LIMIT 1");
while ($row = mysql_fetch_array($result33, MYSQL_ASSOC)) {
$nextid[]=$row['id'];
$nextur[]=$row['url'];
$nextproto[]=$row['photo '];
}
mysql_free_result($result);
}

Как то можно сделать без foreach используя $spisokid и Ускорит ли это процесс?

Вынуть нужно данные по первым 15ти id указанным в $spisokid

Спасибо

KV
На сайте с 22.12.2011
Offline
70
#1
postavkin:
Здравствуйте.
Имеем

$spisokid = "3|7|22|34|104|456|367|478.....";
$massid=explode("|", $spisokid);

foreach ($massid as $value) {
$result33 = mysql_query("SELECT `url`, `photo` FROM `katalog` WHERE `id`='$value' ORDER BY `id` LIMIT 1");
while ($row = mysql_fetch_array($result33, MYSQL_ASSOC)) {
$nextur[]=$row['url'];
$nextproto[]=$row['photo '];
}
mysql_free_result($result);
}


Каким образом Вы без перебора ID сделаете выборку по ID?

Хотя можно Select ... from ... where id in (id1, id2..., ..., idN). Типа того.

Как бы на тебя ни давили, никогда не соглашайся на роль, что тебе не нравится
koders
На сайте с 29.04.2007
Offline
91
#2

Если идентификаторы целые, а в $spisokid содержится перечисление целых в виде 1|2|3|4:

$result33 = mysql_query("SELECT `url`, `photo` FROM `katalog` WHERE `id` IN (" . strtr($spisokid, '|', ',') . ") ORDER BY `id` LIMIT 1");

while ($row = mysql_fetch_assoc($result33)) {
$nextur[]=$row['url'];
$nextproto[]=$row['photo '];
}
postavkin:
Ускорит ли это процесс?

Однозначно.

Бесплатный PHP-скрипт массовой проверки ИКС (https://a-panov.ru/massovaya-proverka-iks-skript-na-php/)
P
На сайте с 06.01.2009
Offline
556
#3

koders, я правильно понял, как Вы показали будет быстрее, чем через foreach ?

Да, я забыл указать, надо из $spisokid взять первые 15 значений.

так будет верно?


$result33 = mysql_query("SELECT `url`, `photo` FROM `katalog` WHERE `id` IN (" . strtr($spisokid, '|', ',') . ") LIMIT 0,15");
while ($row = mysql_fetch_assoc($result33)) {
$nextur[]=$row['url'];
$nextproto[]=$row['photo '];
}

K_V_S:
Каким образом Вы без перебора ID сделаете выборку по ID?

Простите. я не понял вопроса. С foreach все работает.

edogs software
На сайте с 15.12.2005
Offline
714
#4
postavkin:
koders, я правильно понял, как Вы показали будет быстрее, чем через foreach ?
Да, я забыл указать, надо из $spisokid взять первые 15 значений.

так будет верно?.

В изначальный вопрос не вчитывались, но where id in (1,2,3,4,5) limit 0,2 не обязательно выдаст id 1 и 2, может выдать 3 и 5 или 2 и 5 - порядок не определён.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход.
P
На сайте с 06.01.2009
Offline
556
#5
edogs:
В изначальный вопрос не вчитывались, но where id in (1,2,3,4,5) limit 0,2 не обязательно выдаст id 1 и 2, может выдать 3 и 5 или 2 и 5 - порядок не определён.

Код where id in (1,2,3,4,5) limit 0,15 работает.

Значит порядок, который задан в $spisokid = "35|7|22|340|104|1456|367|478....."; можно соблюсти, только через цикл foreach ?

Да, все же порядок не тот, как задан в списке.

Сортирует по id

edogs software
На сайте с 15.12.2005
Offline
714
#6
postavkin:
Код where id in (1,2,3,4,5) limit 0,15 работает.
Значит порядок, который задан в $spisokid = "35|7|22|340|104|1456|367|478....."; можно соблюсти, только через цикл foreach ?

Да, все же порядок не тот, как задан в списке.
Сортирует по id

Он даже не сортирует по ИД, просто так совпало, что выборка отсортирована по ИД.

Совпадает так достаточно часто (т.к. выбирается обычно исходя из физического расположения на диске), но полагаться на это нельзя.

Форич не обязательно, просто в where пихайте только первые 15 элементов. Порядок их как мы поняли Вам не важен.

Например так $spisokid=implode(',',array_slice(explode('|',$spisokid),0,15));

и дальше where id in (".$spisokid.")

P
На сайте с 06.01.2009
Offline
556
#7
edogs:
Он даже не сортирует по ИД, просто так совпало, что выборка отсортирована по ИД.
Совпадает так достаточно часто (т.к. выбирается обычно исходя из физического расположения на диске), но полагаться на это нельзя.

Форич не обязательно, просто в where пихайте только первые 15 элементов. Порядок их как мы поняли Вам не важен.
Например так $spisokid=implode(',',array_slice(explode('|',$spisokid),0,15));
и дальше where id in (".$spisokid.")

Простите, я уже поравил и первый пост и дальше, где показан пример содержимого $spisokid

Там они отсортированы уже по цене товара.

Порядок указанный в $spisokid должен быть соблюден.

Сделал замеры , foreach показывает время 0,01-0,015. А вашим вариантом 0,002.

D
На сайте с 18.12.2015
Offline
142
#8

соблюсти порядок можно по ORDER BY FIELD(ваш_список_из_ID_через_запятую)

ещё советую мапнуть список сконвертировав в int, а то не очень понятно откуда он пришел, вдруг это из query пришло.

ну и да, prepared statements юзайте.

Разработка и поддержка высоконагруженных проектов.
P
На сайте с 06.01.2009
Offline
556
#9
danforth:
соблюсти порядок можно по ORDER BY FIELD(ваш_список_из_ID_через_запятую)
ещё советую мапнуть список сконвертировав в int, а то не очень понятно откуда он пришел, вдруг это из query пришло.
ну и да, prepared statements юзайте.

список $spisokid от сюда


$result17 = mysql_query("SELECT id, idvkat FROM `modification` WHERE... group by `idvkat` order by `zena`");
while ($roqqq = mysql_fetch_array($result17, MYSQL_ASSOC)) {
$idkat[]=$roqqq['idvkat'];
}
$spisokid = implode("|", $idkat);

Мапнуть это так?


$id = $roqqq['idvkat'];
$id = (int)$id;
$idkat[]=$roqqq['idvkat'];



---------- Добавлено 01.08.2018 в 22:58 ----------

danforth, не будете так любезны мне помочь с ORDER BY FIELD(ваш_список_из_ID_через_запятую) ?

$spisokid = implode(",", $idkat);

а как построить запрос для выборки с 0 первых 15ти значений из $spisokid

так?


$newspisokid =array_slice($idkat,0,15); //первые 15ть
$result33 = mysql_query("SELECT `url`, `photo` FROM `katalog` WHERE `id` IN (" . strtr($newspisokid , '|', ',') . ") ORDER BY FIELD (id, "$newspisokid") ");
while ($row = mysql_fetch_assoc($result33)) {
$nextur[]=$row['url'];
$nextproto[]=$row['photo '];
}
$newspisokid =array_slice($idkat,15,15); //вторые 15ть ???
KV
На сайте с 22.12.2011
Offline
70
#10
postavkin:
Простите. я не понял вопроса. С foreach все работает.

foreach и есть перебор

for each, для каждого

---------- Добавлено 02.08.2018 в 00:18 ----------

edogs, а сколько вас там? Странно читать сообщения от "Мы, Николай Второй".

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий