[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Динамические OPTIONS и MySQL
Alexander
Здравствуйте! Я разрабатываю автокаталог. Хочу, чтобы в форме поиска, при выборе марки, в <select> находились лишь те опции (названия марок), у которых машина присутствует в базе. Например, если в моём каталоге находятся только Аудюхи и Мерины, то и в поле выбора марки будет только 2 наименования: AUDI и MERCEDES. Я считаю что нет смысла выводить в <select> Все марки от ACURA до VOLVO, если машин, соответствующих этим паркам в данный момент не имеется в базе. Вот как я это сделал:

PHP
$result $db->QueryResult("SELECT mark_id, mark_name FROM " .MARKS_TABLE);
while(
$row $db->FetchResult($result)) {
        if(
is_parent_empty("mark"$row["mark_id"])) {  // В базе есть машины данной марки, выводим
               
echo "<option value="$row[mark_id]">$row[mark_name]</option>";
        }
        
// если нет - ничё не выводим
}

function 
is_parent_empty($parent$id) {
    
$parent_id $parent."_id";
    
$result $db->QueryResult("SELECT car_id FROM " .CARS_TABLE" WHERE $parent_id='$id'");
    
$num_rows mysql_num_rows($result);
    return(
$num_rows);
}


Всё работает на 5+, но есть 1 НО, а именно - вложенный цикл (вызываемый в ф-и is_parent_empty()). Это будет сильно тормозить базу, с учётом того что мне придётся тоже самое делать и для моделей. Знакомый мне посоветовал сделать всё 1 запросом, используя объединения. Тогда я сделал так:

PHP
$result $db->QueryResult("SELECT t1.mark_id, t1.mark_name FROM $marks_table AS t1, $cars_table AS t2 WHERE t1.mark_id=t2.mark_id");


Но тут у меня вывалилось 10 Аудюх и 4 Мерина. Стало ясно, что надо искать какие-то ещё общие поля которые проверять на равенство, но ничего не получилось. А мне надо всего 2 записи, а не 14! Помогите плиз!
PS: DISTINCT не предлагать - он дерёт всё целиком, просто на экран унии выводит...



Спустя 27 минут, 46 секунд (10.02.2009 - 17:02) sergeiss написал(а):
А чем тебе DISTINCT не угодил? Для чего его тогда использовать, если не для выделения уникальных имен (или идентификаторов)?

Вообще, в твоем случае должен работать такой запрос:
SQL
"SELECT mark_id, mark_name from ".MARKS_TABLE." WHERE mark_id IN (SELECT DISTINCT mark_id FROM ".CARS_TABLE.") "



И не понадобится никаких функций is_parent_empty.
То есть, сначала выбираем все уникальные mark_id из таблицы автомобилей, а затем находим их имена из таблицы марок. И всё в одном запросе.
Проверь, должно сработать. И в твоем примере выдаст только 2 строки, Ауди и Мерс.

Спустя 4 минуты, 21 секунда (10.02.2009 - 17:06) Guest написал(а):
Цитата (sergeiss @ 10.02.2009 - 14:02)
А чем тебе DISTINCT не угодил? Для чего его тогда использовать, если не для выделения уникальных имен (или идентификаторов)?

Вообще, в твоем случае должен работать такой запрос:
SQL
"SELECT mark_id, mark_name from ".MARKS_TABLE." WHERE mark_id IN (SELECT DISTINCT mark_id FROM ".CARS_TABLE.") "



И не понадобится никаких функций is_parent_empty.
То есть, сначала выбираем все уникальные mark_id из таблицы автомобилей, а затем находим их имена из таблицы марок. И всё в одном запросе.
Проверь, должно сработать. И в твоем примере выдаст только 2 строки, Ауди и Мерс.

DISTINCT влияет лишь на ВЫВОД - из базы 1 фиг будут все 14 записей тянуться... Просто в браузер уникумы выкинутся - и их не придётся скриптом парсить... Нагрузка...

Спустя 1 минута, 25 секунд (10.02.2009 - 17:07) Guest написал(а):
И смысл? Можно просто сделать: SELECT DISTINCT mark_id, mark_name from ".MARKS_TABLE."

Спустя 1 минута, 2 секунды (10.02.2009 - 17:08) Guest написал(а):
Цитата (Guest @ 10.02.2009 - 14:07)
И смысл? Можно просто сделать: SELECT DISTINCT mark_id, mark_name from ".MARKS_TABLE."

Ой - сорри - вот тут я намудрил - мне же нужны те где ЕСТЬ авто.... Но всёравно - DISTINCT - это не выход!

Спустя 3 минуты, 46 секунд (10.02.2009 - 17:12) Guest написал(а):
Хотя, sergeiss, может вправду так сделать? Но я за быстродействие боюсь!
PS: в прошлый раз с поиском ты мне помог здорово wink.gif

Спустя 4 минуты, 9 секунд (10.02.2009 - 17:16) sergeiss написал(а):
Знаешь такую поговорку "Глаза боятся, а руки делают"?

Да и быстродействие... Будет у тебя запрос идти 50/1000000 долей секунды или в полтора раза (да хоть в 10 раз) больше... Ты заметишь??????

Спустя 6 минут, 54 секунды (10.02.2009 - 17:23) Guest написал(а):
Цитата (sergeiss @ 10.02.2009 - 14:16)
Знаешь такую поговорку "Глаза боятся, а руки делают"?

Да я знаю, просто 1 дело - реально сделать, а соооовсем другое - через задницу =) У меня не глаза боятся - тормоза в базе ненужны. Просто это поле будет сквозным на всех страницах сайта - и куда бы юзер не зашёл - постоянно этот вот запрос будет выполняться - параллельно с пользовательским запросом на страницу или ещё чего). Или думаешь для базы данных это фигня а не нагрузка?

Спустя 1 минута, 7 секунд (10.02.2009 - 17:24) Guest написал(а):
А если посетителей - 100тыщ в сутки? Ну к примеру?

Спустя 56 секунд (10.02.2009 - 17:25) Guest написал(а):
Цитата (Guest @ 10.02.2009 - 14:24)
А если посетителей - 100тыщ в сутки? Ну к примеру?

Просто я пока всё на localhost-е тестирую - а Opera как-то тормозит... Вот я и боюсь...

Спустя 12 минут, 48 секунд (10.02.2009 - 17:38) sergeiss написал(а):
Скока-скока посетителей в сутки??? wink.gif И каждый - по 10 кликов? Ты не ошибся на несколько порядков? rolleyes.gif

Вообще, для увеличения скорости работы БД можно (и нужно!!!) использовать заложенные в них возможности. Всякие там индексы, VIEW, встроенные функции. Например, индексирование по ключевым словам может увеличить скорость работы на несколько порядков. Заметно это на больших таблицах.
Например, без индексов запрос выполняется 400-500 секунд, с индексами - несколько секунд (меньше 10).
Насчет VIEW... Я их не использовал пока, но знаю, что они тоже очень могут помочь увеличить скорость выполнения запросов, в определенных ситуациях.

Спустя 2 минуты, 50 секунд (10.02.2009 - 17:41) Guest написал(а):
Цитата (sergeiss @ 10.02.2009 - 14:38)
Скока-скока посетителей в сутки??? wink.gif И каждый - по 10 кликов? Ты не ошибся на несколько порядков? rolleyes.gif

Вообще, для увеличения скорости работы БД можно (и нужно!!!) использовать заложенные в них возможности. Всякие там индексы, VIEW, встроенные функции. Например, индексирование по ключевым словам может увеличить скорость работы на несколько порядков. Заметно это на больших таблицах.
Например, без индексов запрос выполняется 400-500 секунд, с индексами - несколько секунд (меньше 10).
Насчет VIEW... Я их не использовал пока, но знаю, что они тоже очень могут помочь увеличить скорость выполнения запросов, в определенных ситуациях.

Хорошо, спасибо, поступлю как Вы советуете - на время пока не доработал проект - а потом буду оптимизировать - можт найду что получше wink.gif
Быстрый ответ:

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