получение данных одним запросом из нескольких таблиц

BNS

Новичок
получение данных одним запросом из нескольких таблиц

Итак, есть 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 например, будет вырезана - останется только от первой табл)
 

Ermitazh

Новичок
Если я правильно понял то здесь нужно использовать INNER JOIN и GROUP BY

-~{}~ 22.08.06 14:37:

Как заставить скрипт знать, на какую таблицу ориентироваться при выводе результатов
А можно более простыми словами, что тебе нужно вывести?
 
Сверху