BNS
Новичок
получение данных одним запросом из нескольких таблиц
Итак, есть 4 таблицы:
Иными словами, у магазина м.б. несколько продаваемых подкатегорий.
Запрос на поиск может быть 3 типов, в зависимости от выбранных параметров поиска (имя, цена, категория товаров)
Это все предыстория, теперь, собственно, вопрос:
Как заставить скрипт знать, на какую таблицу ориентироваться при выводе результатов (иначе при таком подходе, как сейчас, он может выдать 3 подходящих по цене товара как от 3 разных магазинов - вместо одного магазина будет 3 повторяющихся)
DISTINCT c.id вместо * - казалось бы решение, но хочется более красиво.
Как вообще в такого рода запросах можно явно указать, как обзывать выходные переменные? (иначе при mysql_fetch_array мы имеем ассоц. массив из
номер_поля=>значение и
имя_поля=>значений (часть совпадающих имен, id например, будет вырезана - останется только от первой табл)
Итак, есть 4 таблицы:
Код:
1) x_types_master - Список глобальных категорий товаров
+----+------------------+
| id | name |
+----+------------------+
| 1 | Видеотехника |
| 2 | Товары для дома |
+----+------------------+
2) x_types - Подкатегории (можно было бы и в одну объеденить, но уже поздно)
+----+--------+---------------------+
| id | master | name |
+----+--------+---------------------+
| 1 | 1 | Телевизоры |
| 2 | 1 | Видеомагнитофоны |
| 3 | 2 | Холодильники |
+----+--------+---------------------+
3) x_catalog - Список магазинов
+----+-----------------+
| id | name |
+----+-----------------+
| 1 | Магазин №1 |
| 2 | Магазин номер 2 |
+----+---------+-------+
4) x_catalog_types - Таблица связи между id магазина и id подкатегории, а также ценовой диапазон подкатегории
+----+--------+-------+--------+--------+
| id | typeid | catid | price1 | price2 |
+----+--------+-------+--------+--------+
| 38 | 1 | 1 | 200 | 3000 |
| 35 | 1 | 2 | 12 | 213 |
| 39 | 2 | 1 | 1000 | 5000 |
| 37 | 2 | 2 | 200 | 4000 |
| 36 | 3 | 1 | 25 | 235 |
+----+--------+-------+--------+--------+
Запрос на поиск может быть 3 типов, в зависимости от выбранных параметров поиска (имя, цена, категория товаров)
Код:
1) Категория НЕ указана (пример: указана цена)
SELECT *
FROM x_catalog c, x_catalog_types ct
WHERE c.id=ct.catid
AND ct.price1<='200'
AND ct.price2>='200'
ORDER BY c.name
2) Категория указана (пример: указана подкатегория и цена)
SELECT *
FROM x_catalog c, x_catalog_types ct
WHERE ct.catid=c.id
AND ct.typeid='(категория_из_запроса)'
AND ct.price1<='(цена_из_запроса)'
AND ct.price2>='(цена_из_запроса)'
ORDER BY c.name
3) Категория указана (пример: указана _большая_ категория и цена) - самая жесть, ищем во ВСЕХ ТАБЛИЦАХ СРАЗУ
SELECT c.*
FROM x_catalog c, x_catalog_types ct, x_types t, x_types_master tm
WHERE tm.id=t.master
AND t.id=ct.typeid
AND ct.catid=c.id
AND tm.id='(категория_из_запроса)'
AND ct.price1<='(цена_из_запроса)'
AND ct.price2>='(цена_из_запроса)'
ORDER BY c.name
Как заставить скрипт знать, на какую таблицу ориентироваться при выводе результатов (иначе при таком подходе, как сейчас, он может выдать 3 подходящих по цене товара как от 3 разных магазинов - вместо одного магазина будет 3 повторяющихся)
DISTINCT c.id вместо * - казалось бы решение, но хочется более красиво.
Как вообще в такого рода запросах можно явно указать, как обзывать выходные переменные? (иначе при mysql_fetch_array мы имеем ассоц. массив из
номер_поля=>значение и
имя_поля=>значений (часть совпадающих имен, id например, будет вырезана - останется только от первой табл)