Почему MySQL возвращает повторяющуюся информацию в возвращенном массиве JOIN? - PullRequest
0 голосов
/ 19 января 2011

Мне интересно, если я делаю что-то не так, или это просто причуды в том, как все обрабатывается в MySQL.Вот установка: (я не могу найти эту точную тему где-либо еще)

У меня есть две таблицы заказ и меню .

меню имеет 'id' (для элемента), 'item 'и три цены (' prc1 '' prc2 '' prc3 ') в каждой строке.

menu +----+----------+------+------+------+
     |'id'|  'item'  |'prc1'|'prc2'|'prc3'|
     +----+----------+------+------+------+
     |  1 | 'tshirt' | 3.00 | 4.50 | 4.00 |
     |  2 | 'socks'  | 1.00 | 2.50 | 2.00 |
     +----+----------+------+------+------+

заказ также имеет идентификатор элемента для сравнения с меню заказа ('i_id') и целое число Iиспользуйте для фильтрации цен позже в php ('prc_id').

order +------+--------+
      |'i_id'|'prc_id'|
      +--------+------+
      |  1   |   1    | # i_id matches id - tshirt and informs to use prc1
      |  2   |   3    | # i_id matchis id - socks and uses prc3
      +--------+------+

Я использую JOIN для сопоставления заказов до пунктов

"SELECT order.prc_id, menu.item, menu.prc1, menu.prc2, menu.prc3
        FROM order 
        LEFT JOIN menu 
        ON order.i_id = menu.id"

Затем я получаю результатназад и первоначально, чтобы убедиться, что все получилось, я распечатал массив:

$result = mysql_query($query)
while($row = mysql_fetch_array($result))
    {
        print_r($row);
    }

Это массив, который я получаю (очевидно, фиктивная информация для начальных тестов):

Array 
 ( 
    [0] => 1 [prc_id] => 1         #the value (1) for 'prc_id' is given twice
    [1] => tshirt [item] => tshirt #the value (tshirt) for 'item' is given twice
    [2] => 3.00 [prc1] => 3.00     #the value (3.00) for 'prc1' is given twice
    [3] => 4.50 [prc2] => 4.50     #etc
    [4] => 4.00 [prc3] => 4.00

    [0] => 3 [prc_id] => 3
    [1] => socks [item] => socks
    [2] => 1.00 [prc1] => 1.00 
    [3] => 2.50 [prc2] => 2.50 
    [4] => 2.00 [prc3] => 2.00
 )

Итак, мой вопрос (наконец, верно? XD) ... Почему дублированные данные отправляются обратно в ответе массива?

Я сделал что-нибудьнг не так?Я что-то пропускаю?

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

Спасибо за ваше время.:)

Ответы [ 2 ]

1 голос
/ 19 января 2011

Если вы считаете, что это проблема PHP print_r().

print_r() возвращает числовое представление и вторую строку именованного хранилища.

РЕДАКТИРОВАТЬ:

Попробуйтезапрос с помощью инструмента запросов базы данных, тогда вы увидите исходный результат.

0 голосов
/ 19 января 2011
     SELECT order.prc_id, menu.item, menu.prc1, menu.prc2, menu.prc3
     FROM order
      LEFT JOIN menu
      ON order.i_id = menu.id

Похоже, что вы присоединяетесь на основе item_id в order и id из menu, в то время как вы должны делать это на основе (если я правильно понимаю) item_id из menu.

Что-то вроде:

     SELECT order.prc_id, menu.item, menu.prc1, menu.prc2, menu.prc3
     FROM order
      LEFT JOIN menu
      ON order.i_id = menu.item_id
...