Сгенерированные по запросу таблицы с полями данных «многие ко многим», наилучшая практика? - PullRequest
2 голосов
/ 22 февраля 2010

У вас есть две гипотетические таблицы:

TABLE 1
[id]  [item]  [amount]  [cost]
 1     hat     20        10
 2     shoe    7         45
 3     belt    2         25

TABLE 2 (many to many)
[item]  [color]
 hat     blue
 hat     red
 hat     yellow
 shoe    black
 shoe    white
 etc.    etc.

и когда вы запускаете запрос, вы хотите вывести список, который включает все эти данные, например:

[ITEM]  [AMOUNT]  [COST]  [AVAILABLE COLORS]
 hat     20        10      blue, red, yellow
 shoe    7         45      black, white
 etc.

Если бы цветов не было, было бы одним запросом собрать всю эту информацию из одной таблицы и обработать массив в цикле. Но для размещения TABLE 2 я могу придумать два способа сделать это:

Brute Force: запускает запрос для каждого возврата, чтобы получить данные из TABLE 2, добавить запятые и вставить их в массив результатов из TABLE 1, а затем вывести таблицу HTML

Уродливый обходной путь: добавить новый столбец к Table 1 и периодически обновлять строки данных из Table 2 за кулисами

... есть лучший способ, верно?

1 Ответ

2 голосов
/ 22 февраля 2010

Если вы работаете с MySQL, функция GROUP_CONCAT может вас заинтересовать.

См., Например, этот вопрос: Можно ли объединить несколько строк MySQL в одно поле?


Иначе, описанное вами решение "грубой силы", как правило, используется - возможная оптимизация заключается в том, чтобы выполнить только один запрос, чтобы получить строки из второй таблицы, которые соответствуют всем строкам из первой таблицы одновременно.

Например, вы бы:

  • сделать запрос, чтобы получить эти данные из первой таблицы
  • сделать один запрос, чтобы получить все данные из второй таблицы, которые соответствуют данным из первой таблицы - что-то вроде select * from table_2 where item in ('hat', 'shoe', 'belt')
  • использовать цикл на стороне PHP для "повторного присоединения" результатов второго запроса к результатам первого

С этим решением вы будете выполнять немного больше работы на стороне PHP, но только 2 запроса - вместо 1 + (количество строк, возвращаемых из первого запроса); что, как правило, намного лучше, когда у вас есть много строк, возвращенных из первого запроса.

...