Показать сообщение отдельно
  #49 (permalink)  
Старый 29.05.2015, 15:04
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

У вас что "французский" SQL?

Ошибка потому, что объединение запроса не потому полю. ID размера это уникальный для размера ключ.

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

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

Пусть таблица продуктов, условно products
pid name    etc
1   name 1  aaaaaa
2   name 2  bbbbbb

Таблица размеров, условно proportions
id   size
1    19
2    20
3    21
4    22

А вот так они связываются через внешнюю таблицу, условно назовем ее relations:
pid  id
1     1
1     2
1     4
2     1
2     3

И у этой таблицы pid + id, это составной уникальный ключ, который не позволит одному и тому же продукту указать два и более раза один и тот же размер. Из этой таблицы видно, что продукт 1 имеет размеры 19, 20 и 22, а продукт 2 размеры 19 и 21. Если ведется учет количества размеров на складе, то эта таблица может содержать и поле описывающее это количество для каждого из размеров у каждого из продуктов.

Чтобы получить товары и их размеры, запрос к таблице продуктов обращается к этой таблице соединяя их как

ON relations.pid = products.pid

А по полученному таким образом id размера из этой таблицы, объединяем в запрос и таблицу размеров как

ON relations.id = proportions.pid

Получаем такой запрос:
$q = mysql_query('SELECT * 
                  FROM products
                  LEFT JOIN relations
                  USING(pid)
                  LEFT JOIN proportions
                  USING(id)
                  ORDER BY name, size');


Так как имена полей в таблицах по которым они связываются одни и те же что в родительских, что в таблице связей, то используется USING(). Результатом будет ресурс:
Array
(
    [0] => Array
        (
            [id] => 1
            [pid] => 1
            [name] => name 1
            [etc] => aaaaaa
            [size] => 19
        )

    [1] => Array
        (
            [id] => 2
            [pid] => 1
            [name] => name 1
            [etc] => aaaaaa
            [size] => 20
        )

    [2] => Array
        (
            [id] => 4
            [pid] => 1
            [name] => name 1
            [etc] => aaaaaa
            [size] => 22
        )

    [3] => Array
        (
            [id] => 1
            [pid] => 2
            [name] => name 2
            [etc] => bbbbbb
            [size] => 19
        )

    [4] => Array
        (
            [id] => 3
            [pid] => 2
            [name] => name 2
            [etc] => bbbbbb
            [size] => 21
        )

)

в котором проходом в цикле по ключу pid получаем описание товара и список его размеров.

Вы в своем запросе пытаетесь связать таблицы как ID товара равно ID размера, что даже по логике несуразица, и об остальном можно и не говорить уже.

Последний раз редактировалось laimas, 29.05.2015 в 15:07.
Ответить с цитированием