[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как укоротить тройной while?
Jekel
Здравствуйте, подскажите пожалуйста...это реально укоротить (оптимизировать тк сказать)? :huh:

			$at = array ();

$w3 = mysql_query("SELECT * FROM cat WHERE shop='".$id."'");
while($a3 = mysql_fetch_assoc($w3)){
$w2 = mysql_query("SELECT * FROM scat WHERE cat='".$a3['id']."'");
while($a2 = mysql_fetch_assoc($w2)){
$w1 = mysql_query("SELECT * FROM sscat WHERE scat='".$a2['id']."'");
while($a1 = mysql_fetch_assoc($w1)){
$at[] = $a1['id'];
}
}
}




Спустя 11 минут, 36 секунд (25.01.2011 - 01:17) inpost написал(а):
Что это вообще такое? Что достаётся?
У тебя вообще стоит SELECT *, поэтому неизвестны поля таблицы.

Спустя 7 минут, 8 секунд (25.01.2011 - 01:24) inpost написал(а):
Делай первую выборку, всё полученное в массив, вторую выборку из массива
WHERE `id` IN (тут через запятую, объеденяй через implode)

Спустя 9 минут, 30 секунд (25.01.2011 - 01:34) Jekel написал(а):
так это уже потом делается

$a = mysql_query("SELECT * FROM `products` WHERE `active`=1 AND `sscat` IN (" . join(',', $at) . ") ORDER BY RAND() DESC LIMIT 9");

Спустя 3 минуты, 38 секунд (25.01.2011 - 01:37) Jekel написал(а):
в бд таблици cat, scat, sscat, products (категории, субкатегории, суб-субкатегории, продукты)
код:
дано $id это номер магазина (их вообще два) в зависимости от номера надо вывести 9 случайных товаров.

столбец shop (тоесть номер магазина) есть только в табличке cat...вот я и пытаюсь через категории выйти на все товары из $id магазина и вывести из них 9 случайных товаров

кароче я получаю список всех суб-субкатегорий и по ним фильтрую товары)

Спустя 6 минут, 49 секунд (25.01.2011 - 01:44) Evilsoul написал(а):
Что-то ты сильнл закрутил...
ЭТО РЕАЛЬНО, если ты напишешь какие таблицы, что там и с чем их едят.
Желательно пример, так как таблиц у тебя 4.
тоисть

таблица:1
|id|...|...|...

таблица:2
|id|...|...|...

таблица:3
|id|...|...|...

таблица:4
|id|...|...|...

Спустя 4 минуты (25.01.2011 - 01:48) Jekel написал(а):
cat
id|name|shop

scat
id|name|cat

sscat
id|name|scat

products
id|name|sscat

Спустя 8 минут, 21 секунда (25.01.2011 - 01:56) Evilsoul написал(а):
"SELECT * FROM `cat`, `scat`, `sscat` 
WHERE `shop`.`cat` ='"
.$id."'
AND `shop`.`cat`= `id`.`scat`
AND `id`.`scat`=`id`.`sscat`"


ток проверь, я не помню, или столбец таблицы перед точкой или имя таблици. уже спать иду...

Спустя 9 минут, 5 секунд (25.01.2011 - 02:06) inpost написал(а):
Jekel
Ты так и не сказал, что в итоге всей выборки ты получаешь? Лишь ID как по примеру, или все данные?

Спустя 2 минуты, 7 секунд (25.01.2011 - 02:08) Админ написал(а):
тут структуру таблиц надо менять а не циклы городить

Спустя 5 минут, 20 секунд (25.01.2011 - 02:13) inpost написал(а):
Вообщем, структура такая:
id, name, cat_lvl1, cat_lvl2, cat_lvl3.
Допустим первого уровня выглядит так:
1 , Товары легкие, 0
Второго уровня:
2, игрушки, 1, 0
Третьего уровня:
3, модельки, 5,3,0

Если 0, значит данного уровня товар, если другое значение, значит это вложенность. Если число не 0, то это порядковый номер.

Спустя 12 минут, 56 секунд (25.01.2011 - 02:26) Jekel написал(а):
структура это же пример я дал..там все сложнее и менять не надо ничего
Evilsoul толк написал, ща проверю

Спустя 6 минут, 55 секунд (25.01.2011 - 02:33) Jekel написал(а):
$a = mysql_query("SELECT * FROM `products`, `cat`, `scat`, `sscat` WHERE `shop`.`cat`='".$id."' AND `id`.`cat`=`cat`.`scat` AND `id`.`scat`=`scat`.`sscat` AND `id`.`sscat`=`sscat`.`products` ORDER BY RAND() DESC LIMIT 9");

вот так должно быть, но оно не фурычит

Спустя 3 минуты, 6 секунд (25.01.2011 - 02:36) Invis1ble написал(а):
имхо, там join юзать надо в запросах...

Спустя 1 минута, 31 секунда (25.01.2011 - 02:37) Jekel написал(а):
юзал, а таким условием не получится? так оно даже ошибок не дает

Спустя 7 минут, 13 секунд (25.01.2011 - 02:45) Invis1ble написал(а):
Jekel
я говорю про мускульный JOIN, а не про пхп-шную ф-цию join()
Цитата
таким условием не получится? так оно даже ошибок не дает

не уверен, но вроде и не должно получаться... кривой запрос, имхо

Спустя 3 минуты, 22 секунды (25.01.2011 - 02:48) Jekel написал(а):
мда, наоборот просто писать надо было)))
@$a = mysql_query("SELECT * FROM `cat`, `scat`, `sscat`, `products` 
WHERE `cat`.`shop`="
.$id." AND `cat`.`id`=`scat`.`cat` AND `scat`.`id`=`sscat`.`scat` AND `sscat`.`id`=`products`.`sscat` ORDER BY RAND() DESC LIMIT 9");

ща гляну join, спасибо

Спустя 28 минут, 51 секунда (25.01.2011 - 03:17) inpost написал(а):
SELECT * FROM `table1`
while()
$temp1[] = $row['id'];
SELECT * FROM table2 WHERE `id` IN (implode(',',$temp1))
while()
temp2[] = $row['id'];
SELECT * FROM `table3` WHERE `id` IN (implode(',',$temp2))
while()
$id[] = $row['id'];


3 запроса, не всегда вложенные запросы бывают быстрее! Таких 3 могут обогнать обычный общий. Надо тестировать и проверять, но это один из оптимальных для большого выбора.

Спустя 5 часов, 25 минут, 58 секунд (25.01.2011 - 08:43) Evilsoul написал(а):
Jekel
Я же тебе говорил, проверь, а то сонный был smile.gif)))

Invis1ble
Зачем ему JOIN? Джоин лепит из нескольких таблиц одну а ему нужна выборка одно значение = другому И другое = третьему и т.д.

Спустя 8 часов, 35 минут, 55 секунд (25.01.2011 - 17:19) Invis1ble написал(а):
не знаю, я особо не вникал ) просто предположение высказал

Спустя 11 минут, 56 секунд (25.01.2011 - 17:31) linker написал(а):
SELECT FROM `table1`, `table2`
равносилен
SELECT FROM `table1`
LEFT JOIN `table2`
Быстрый ответ:

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