[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: запрос в цикле. помогите избавиться
totje
имеется поле в 1й таблице со строкой, в которой перечислены некие id через запятую.
нужно выдернуть по этим id инфу с другой таблицы, пока эти самые id не закончатся или пока их кол-во меньше 24.

я делаю это так:

$a = explode(",", $row['pole']);

while ($i<24)
{
$id=intval($a[$i]);
$query=mysql_query("SELECT * FROM `table2` WHERE `id`=$id");
$arr= mysql_fetch_array($query);
echo $arr['infa'];
$i++;
}

получается +24 (а иногда и +48) запроса на страницу к имеющимся всего 6-8.
реально ли это "убрать" в один?



Спустя 30 минут, 28 секунд (17.01.2011 - 11:15) ApuktaChehov написал(а):
Лучше постойте тело запроса в цикле по этим id, а после сделайте запрос.

Спустя 7 минут, 35 секунд (17.01.2011 - 11:22) Snus написал(а):
$a = explode(",", $row['pole']);
$query = "SELECT * FROM `table2` WHERE ";
$i = 0;
foreach($a as $id){
$i++;
if($i > 1) $query .= ' OR ';
$query .= "`id` = '$id'";
if($i > 24) break;
}
$sql = mysql_query($query) or die(mysql_error());
while ( $rows = mysql_fetch_assoc($sql) ){
...
}

Спустя 2 минуты, 5 секунд (17.01.2011 - 11:24) linker написал(а):
Извращение, но всеже
SELECT `table2`.* FROM `table1`
LEFT JOIN `table2` ON CONCAT(",", `pole`, ",") LIKE CONCAT("%,",`id`, ",%")
LIMIT 24
$res = mysql_query(ЗАПРОС ВЫШЕ);
while($arr = mysql_fetch_assoc($res))
{
echo $arr['infa'];
}

Спустя 2 минуты, 30 секунд (17.01.2011 - 11:27) sergeiss написал(а):
В условии (единственного) запроса надо написать
where id in (список_айди_через_запятую)

а сам список айди можно составить 2-мя способами:
1. Сделать одну выборку из другой таблицы.
2. Сделать подвыборку в этом же запросе. То есть, вместо списка айди будет сразу select из второй таблицы. Этот способ, на мой взгляд, предпочтительнее. При этом ты можешь также контролировать, сколько айди будет выбрано.

Спустя 4 минуты, 55 секунд (17.01.2011 - 11:32) linker написал(а):
sergeiss
К сожалению WHERE `id` IN (подзапрос) тут не сработает.

Спустя 24 минуты, 31 секунда (17.01.2011 - 11:56) totje написал(а):
спасибо всем за советы.
пока попробовал вариант, предложенный Snus, и все отлично работает, только инфа выводится без повторений - например, если в поле строка вида 21,2,21,24, то на выводе будет всего три строки, без повторения 21, но это не критично, т.к. повторения вообщем-то исключены.
linker
ругаеца на запятые, а если взять их в ', а не ", то "Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given "

Спустя 12 минут, 14 секунд (17.01.2011 - 12:09) sergeiss написал(а):
Цитата (linker @ 17.01.2011 - 12:32)
К сожалению WHERE `id` IN (подзапрос) тут не сработает.

Может быть, я именно с MySQL не особо smile.gif Но можно составить список этих айди, вместо того, чтобы их через OR перечислять.

Спустя 1 час, 18 минут, 39 секунд (17.01.2011 - 13:27) linker написал(а):
totje
Прошу прощения

$Query = "SELECT `table2`.* FROM `table1` "
. "LEFT JOIN `table2` ON CONCAT(',', `pole`, ',') LIKE CONCAT('%,',`id`, ',%') "
. "GROUP BY `id` "
. "LIMIT 24";
$res = mysql_query($Query);

Спустя 2 часа, 26 минут, 38 секунд (17.01.2011 - 15:54) totje написал(а):
linker
спасибо, а какой способ оптимальнее? этот или с OR, который предложил Snus?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.