[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Существует ли замена 2х циклов стандартами SQL ?
UnWind
Доброе время суток Уважаемые Дамы и Господа.
Сталкнулся с таким вот вопросом, поскольку надоело уже грузить программы циклами.
Задача:
Построение поисковой программы определенных товаров, по каталогам фирм.
Поиск по каталогу при помощи таблицы CSV.
Выдача минимум 5ти результатов по одной товарной позиции.

Пример:
Запрос: "Бензин АИ95"
Результат на выходе:
"Бензин АИ95":
1. Лукоил - 95 тг за литр г. Астана проспект Победы строение 3
2.Nomad Auto - 140 тг за литр г.Астана проспект Республики
и т.д.

Общее количество товарных позиций, по которым осуществляется поиск - около 10 000 за раз (Т.е. это один CSV файл и разовый запрос)

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

Заранее Благодарю Вас за ответ !



Спустя 20 минут, 13 секунд (17.01.2012 - 07:45) rooor написал(а):
А что мешает в одном запросе вытащить и заголовок и результат?
JOIN или подзапросы... если я правильно понял вопрос... А вообще - лучше пример кода приведи, чтоб понятней было

Спустя 12 минут, 17 секунд (17.01.2012 - 07:57) UnWind написал(а):
Хорошо, вот пример

$sql = mysql_query("SELECT name FROM price WHERE (name, type) LIKE ('Ключевое слово для поиска','Тип товара');
while(
$select = mysql_fetch_row( $sql ) ) {
echo
$select[0] . ' точки продаж:';
$sql = mysql_query("SELECT address FROM company WHERE type='Тип товара'");
while(
$select = mysql_fetch_row( $sql) ) {
echo
$select[0] . "<br/>";
}
echo '<br/>';
}


Возможно ли избавится от этих двух циклов ?
С условием что список адресов тех самых магазинов/компаний, должен содержать минимум 5ть компаний.

Спустя 17 минут, 50 секунд (17.01.2012 - 08:15) rooor написал(а):
Попробуй так...
$sql = mysql_query("SELECT `name`, `address` FROM `price` a JOIN `company` b ON a.`type` = b.`type`  WHERE a.(name, type) LIKE a.('Ключевое слово для поиска','Тип товара');

Спустя 6 минут, 31 секунда (17.01.2012 - 08:22) UnWind написал(а):
rooor
По твоему запросу, можно вывести через ключ только 1 значение с первой таблицы и одно со второй.
Т.е. получится примерно так на выходе: Бензин 95 - КазМунайГаз и все.
А мне надо: Бензин 95 - КазМунайГаз, Номад Оил, Аурика и т.д. до пяти.
Я ищу вариант типо такого:

Select {
'name' - Бензин 95;
'company' - КазМунайГаз, Номад Оил, Аурика;
}


while( $select = mysql_fetch_row( $sql ) ) {
echo $select[0] . ' - ' . $select[1] . '<br/>';
}

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

Спустя 47 минут, 8 секунд (17.01.2012 - 09:09) Placido написал(а):
Для этого используйте GROUP BY в сочетании с GROUP_CONCAT.
SELECT `name`, GROUP_CONCAT(`company`) FROM `таблица` GROUP BY `name`;

Если в таблице есть несколько записей для одних и тех же `name` - `company`, для того чтобы выбрать только неповторяющиеся значения, используйте такую запись
SELECT `name`, GROUP_CONCAT(DISTINCT `company` ORDER BY `company` DESC SEPARATOR ', ') FROM `таблица` GROUP BY `name`;

По умолчанию разделитель - запятая без пробела. Его можно изменить, указав параметр SEPARATOR.

Спустя 5 минут, 39 секунд (17.01.2012 - 09:15) UnWind написал(а):
Placido
Спасибо большое!) Чего то я про это совсем и забыл.
Очень Вам благодарен! smile.gif


_____________
Искусство программирования - заставить компьютер делать всё то, что Вам делать лень!
Быстрый ответ:

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