Сталкнулся с таким вот вопросом, поскольку надоело уже грузить программы циклами.
Задача:
Построение поисковой программы определенных товаров, по каталогам фирм.
Поиск по каталогу при помощи таблицы 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 или подзапросы... если я правильно понял вопрос... А вообще - лучше пример кода приведи, чтоб понятней было
JOIN или подзапросы... если я правильно понял вопрос... А вообще - лучше пример кода приведи, чтоб понятней было
Спустя 12 минут, 17 секунд (17.01.2012 - 07:57) UnWind написал(а):
Хорошо, вот пример
Возможно ли избавится от этих двух циклов ?
С условием что список адресов тех самых магазинов/компаний, должен содержать минимум 5ть компаний.
$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' - КазМунайГаз, Номад Оил, Аурика;
}
Т.е. все компании беруться из одной таблицы с условием, что их 5ть или максимально возможное количество, если меньше пяти и становятся частью массива и выводятся в одном цикле.
По твоему запросу, можно вывести через ключ только 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.
Если в таблице есть несколько записей для одних и тех же `name` - `company`, для того чтобы выбрать только неповторяющиеся значения, используйте такую запись
По умолчанию разделитель - запятая без пробела. Его можно изменить, указав параметр SEPARATOR.
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](http://phpforum.ru/html/emoticons/smile.gif)
_____________
Искусство программирования - заставить компьютер делать всё то, что Вам делать лень!