2013-08-26 3 views
1

, например, у меня есть несколько таблиц:
Продукты: атрибутMySQL несколько выбирает в одном запросе

| product_id | name | price | 
| 1   | apple | 20.32 | 
| 2   | pear | 9.99 | 
| 3   | banana | 1.5 | 

продукта:

| attr_id | name | value | 
| 1  | weight | 10 kg | 
| 2  | date | 2013 | 
| 3  | color | red | 

... и так далее.
Наконец продукт-атрибут отношения таблицы:

| product_id | attr_id | 
| 1   | 3  | 
| 2   | 1  | 
| 1   | 2  | 
| 3   | 2  | 

Мой вопрос: есть ли доступно конструкт ONE выберите запрос запрос, который возвращает продукт 1 и 2 в следующем составе данных (или аналогичный)? Теперь я должен сначала запустить детермированные запросы на выбор «где product_id IN (1, 2)», а затем через цикл loop выбрать их атрибуты.
Извините за плохой английский:]

array(
    [0] = array(
      product_id = 1, 
      name = apple, 
      attributes= array(
         [0] => array(
          attr_id = 3, 
          name = color, 
          value = red, 
         ), 
         [0] => array(
          attr_id = 2, 
          name = date, 
          value = 2013, 
         ) 

        ), 
    ), 
    [1] = array(
      product_id = 2, 
      name = apple, 
      attributes= array(
         [0] => array(
          attr_id = 1, 
          name = veight, 
          value = 10 kg, 
         ), 
        ), 
    ) 
) 
+0

Вы хотите получить вложенный массив с продуктом и его данными свойств, например, на вашем примере? Я просто не уверен, понял ли я тебя. – MihanEntalpo

+0

Да, мне нужно получить несколько продуктов с их атрибутами в одном запросе. Если это возможно :) – Mindaugas

+0

Лучше будет дизайн, если вы сохраните все атрибуты в таблице Products ... – Justin

ответ

1

Это не вопрос только запрос, но и PHP код. Это будет соответствовать:

$rSelect = mysqli_query('SELECT 
    products.id AS record_id, 
    products.name AS products_name, 
    products.price AS product_price, 
    attributes.id AS attribute_id, 
    attributes.name AS attribute_name, 
    attributes.value AS attribute_value 
    FROM 
    products 
    LEFT JOIN products_attributes 
     ON products.id=products_attributes.product_id 
    LEFT JOIN attributes 
     ON products_attributes.attr_id=attributes.id', $rConnect); 

$rgResult = []; 
while($rgRow = mysqli_fetch_array($rSelect)) 
{ 
    $rgResult[$rgRow['record_id']]['product_id'] = $rgRow['record_id']; 
    $rgResult[$rgRow['record_id']]['name']   = $rgRow['product_name']; 
    $rgResult[$rgRow['record_id']]['price']  = $rgRow['product_price']; 
    $rgResult[$rgRow['record_id']]['attributes'][] = [ 
     'attr_id' => $rgRow['attribute_id'], 
     'name' => $rgRow['attribute_name'], 
     'value' => $rgRow['attribute_value'], 
    ]; 
}; 
//var_dump($rgResult); 
0

Запроса, который вы ищете:

select 
    p.product_id, 
    p.name as product_name, 
    a.attr_id, 
    a.name as attr_name, 
    a.value 
from 
    products as p 
    inner join `product-attribute` as pa on p.id = pa.product_id 
    inner join attribute as a on pa.attr_id = a.attr_id 

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

Вы можете заметить 2 вещи в этом запросе:

  • Я использую кавычку ` вокруг имени таблицы product-attribute, потому что он содержит тир - в названии, который зарезервирован. Таким образом, вам нужно избежать имени, поставив его в backticks.
  • потому что имя поля name неоднозначно, я даю им псевдоним (product_name/attr_name), поэтому в дальнейшем они могут по-прежнему ссылаться на псевдоним.
Смежные вопросы