sql select в отношении «многие ко многим» не работает должным образом, модель данных проектирования EAV - PullRequest
0 голосов
/ 21 июля 2011

sql выберите в отношении многие ко многим не работает, как ожидалось

У меня есть следующие таблицы по отношению ко многим ко многим:

table product:
prd_cod (pk)
cat_cod (fk)
prd_nome 

table description_characteristic:
prd_cod(fk)
id_characteristic(fk)
description

table characteristic:
id_characteristic(pk)
name

мы предполагаем, что cat_cod будет равен 1, поэтому я хочу показать все продукты с кодом категории, равным 1, которые будут динамически предоставляться в php для параметра ...

Я сделал этот выбор ниже, чтобы решить мою проблему:

select p.prd_cod,p.prd_name,c.name_characteristic,dc.description
from product p,description_characteristic dc, characteristic c
where p.prd_cod = dc.prd_cod and
dc.id_ccharacteristic = c.id_characteristic and
p.cat_cod = 1

но данные были показаны таким образом:

Prd_cod  Prd_name   name_characteristic  descript  
  1          pen        Color            pink      
  1          Pen        manufacturer     kingston  
  1          Pen        type                 brush
  1          Pen        weight               0.020

Я хочу показать результат следующим образом:

Prd_cod  Prd_name   name_characteristic  descript  name_characteristic  descript
  1          pen        Color            pink      type                 brush
  2          Pen-drive  manufacturer     kingston  weight               0.020

Я бы хотел показать все характеристики одного и того же продукта, а не только два, как указано выше ...

Я не могу сделать выбор, чтобы решить эту проблему пожалуйста, мне нужна помощь Спасибо всем

1 Ответ

0 голосов
/ 21 июля 2011

Как сказал Том Х., ваш макет базы данных может быть плохой идеей, и вы можете пересмотреть его. Тем не менее, не существует действительно чистого решения, обеспечивающего необходимый набор результатов mysql. Но вы можете использовать что-то сумасшедшее с GROUP_CONCAT, как это, воспроизводя реальные данные с некоторой постобработкой на стороне PHP:

SELECT p.prd_cod, p.prd_name, GROUP_CONCAT(c.name_characteristic), GROUP_CONCAT(dc.description)
from product p,description_characteristic dc, characteristic c
where p.prd_cod = dc.prd_cod and
dc.id_ccharacteristic = c.id_characteristic and
p.cat_cod = 1
GROUP BY p.prd_cod

Это должно вернуть что-то вроде

Prd_cod  Prd_name   name_characteristic               descript  
  1          pen        Color,manufacturer            pink,Apple

этот набор результатов должен быть обработан следующим образом:

$out = array();
foreach ($result as $res) {
    $p = array_combine(
             explode(",", $res["name_characteristic"]),
             explode(",", $res["descript"]));
    $p["prd_cod"] = $res["prd_cod"];
    $out[] = $p;
}

Я бы не назвал это надежным решением, например - запятые в ваших значениях испортили все. Если вы хотите избежать такого безумия, вам придется постобработать уже полученный результат.

Но если вы хотите продемонстрировать некоторые безумные навыки агрегации sql (и вам, похоже, будет интересно, как вы выбрали этот макет базы данных), этот вариант для вас.

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