#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