Для каждого результата, возвращаемого SQL-запросом, я хочу, чтобы as давал другое имя

#php #mysql #sql #phpmyadmin

#php #mysql #sql #phpmyadmin

Вопрос:

Мой оператор SQL выглядит так

 SELECT beds.id,beds.name,beds.brand,beds.price,beds.disprice,feature.feature AS feature 
FROM beds,feature,bedFeatures 
WHERE bedFeatures.featureID = feature.id AND bedFeatures.bedID = beds.id
  

Я получаю этот результат

 id  name        brand   price   disprice    feature
10  Big Sleeper ZZZZ    10000   1           Oak
10  Big Sleeper ZZZZ    10000   1           Ash
10  Big Sleeper ZZZZ    10000   1           White
  

Я хочу, чтобы AS присваивал каждой функции уникальное имя, такое как feature1 feature2 feature3, чтобы эти 4 строки отображались в одной. Возможно ли это?

Результат, который я ищу, будет выглядеть примерно так

 id  name        brand   price   disprice    feature1 feature2 feature3
10  Big Sleeper zzzz    1000    1           Oak      Ash      White
  

Комментарии:

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

2. Обновлено. Надеюсь, это поможет

3. [Есть ли ограничение на количество функций, которые что-то может иметь?]

4. Да, есть 4 функции продукта

5. Все ли возможные значения для функций известны заранее? Сколько их?

Ответ №1:

Точный результат, который вы запрашиваете, нелегко получить, за исключением использования GROUP_CONCAT() для перечисления функций в виде списка, разделенного запятыми, а не отдельных столбцов.

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

Я бы рекомендовал использовать GROUP_CONCAT() для извлечения функций в виде списка, разделенного запятыми, а затем разделить их с помощью PHP на вашем прикладном уровне.

 SELECT
  beds.id,
  beds.name,
  beds.brand,
  beds.price,
  beds.disprice,
  GROUP_CONCAT(feature) AS features
FROM
  beds
  JOIN bedFeatures ON beds.id = bedFeatures.bedID
  JOIN features ON features.id = bedFeatures.featureID
GROUP BY beds.id, beds.name, beds.brand, beds.price, disprice
  

Результат этого будет выглядеть так:

 d  name        brand   price   disprice    features
10  Big Sleeper zzzz    1000    1           Oak,Ash,White
  

В вашем PHP при извлечении результатов explode() функции преобразуются в массив:

 $resultset = array();
while ($row = mysql_fetch_assoc($result)) {
  // First append the whole row onto the result set as it is...
  $resultset[$row['id']] = $row;
  // Overwrite the `features` string with an array instead...
  $resultset[$row['id']]['features'] = explode(",", $row['features']);
}
  

Наконец, получите доступ к функциям вашего приложения как:

 foreach ($resultset as $r) {
  echo $r['features'][0];
  echo $r['features'][1];
  echo $r['features'][2];
  echo $r['features'][3];
}
  

Комментарии:

1. По какой-то причине это дает мне массив символов, когда я печатаю в foreach

2. @SamMarland В вызове explode() отсутствовал разделитель-запятая. Изменено выше на explode(",", $row['features']);

3. Строка выглядит следующим образом $resultset[$row[‘id’][‘features’] = explode(«,», $row[‘features’]); Должно ли это выглядеть как $resultset[$row[‘id’][‘featues’]] = explode («‘»,$row[‘features’);

4. На самом деле, $resultset[$row['id']]['featues'] закройте скобку после $row['id']

5. Извините за все ошибки, но их сложно обнаружить при быстром вводе в поле ответа SO. 🙂

Ответ №2:

Вы ищете GROUP_CONCAT .

Комментарии:

1. Это дает вам строку, и я ищу, чтобы они были отдельными. поэтому я могу получить к ним доступ, используя feature1 feature2 feature 3