Сортированный вывод объединенного результата MySQL в PHP - PullRequest
0 голосов
/ 25 сентября 2011

Я работаю над проектом allnighter, и у меня нет ничего общего ... Простой вопрос:

У меня есть две таблицы MySQL: продукт и категория. Каждый товар относится ровно к одной категории. В каждой категории есть несколько товаров.

SELECT 
  p.uid as product_uid, p.name_NL as product_name, p.price as product_price,
  c.uid as category_uid, c.name_NL as category_name 
FROM 
  product p, category c
WHERE
  p.category_uid = c.uid

Это дает мне хороший обзор всех продуктов в соответствующей категории. Мой вопрос о выводе этих данных на странице. Я стремлюсь к этому:

<h1>Category name</h1>
<p>Product in this category</p>
<p>Other product in this category</p>

<h1>Next category</h1>
<p>Product in next category</p>

Мой разум сейчас совершенно пуст. Как можно это сделать?

Я бы хотел избежать выполнения подзапросов (если это возможно).

С уважением,

M

Ответы [ 4 ]

4 голосов
/ 25 сентября 2011

Как насчет добавления ORDER BY category_uid, чтобы продукты были упорядочены по категориям в вашем запросе SQL.Затем с помощью PHP выполните цикл по каждому продукту (строке), а при появлении новой категории добавьте новый заголовок.

Пример:

<?php

// ...

$previous_category_uid = null;

// Loop through each row.
while ( $row = $result->fetch_assoc() )
{
  // If the category UID is not the same as the one from the previous row, add a header.
  if ( $previous_category_uid != $row['category_uid'] )
  {
    echo '<h1>' . $row['category_name'] . '</h1>';
    $previous_category_uid = $row['category_uid'];
  }
}

Преимуществоэтот метод заключается в том, что вам не нужно вкладывать запросы.Достаточно одного запроса.

0 голосов
/ 25 сентября 2011

Вообще говоря, у вас есть два варианта:

  1. Получите все данные одновременно (как вы делаете в настоящее время), а затем используйте PHP для предварительной сортировки данных по категориям. Затем выполните выходной цикл для этого массива. Итак, 1 запрос, 2 + n циклов (где n - количество категорий).
  2. Получите все ваши категории, а затем зациклите их для вывода. На каждой итерации вам нужно будет запрашивать все продукты для этого цикла. Таким образом, 1 + n запросов, 1 + n циклов (где, опять же, n - это количество категорий).

Вариант 2 может быть более простым, но очевидно, что есть больше запросов. В конце концов, это ваш звонок.

0 голосов
/ 25 сентября 2011

Если вы ищете алфавитный порядок названий категорий и продуктов в каждой категории:

SELECT 
  p.uid as product_uid, p.name_NL as product_name, p.price as product_price,
  c.uid as category_uid, c.name_NL as category_name 
FROM product p INNER JOIN category c ON p.category_uid = c.uid
ORDER BY category_name, product_name

Это также преобразует декартово произведение вашего запроса и WHERE во внутреннее соединение.

Для вывода с нужными заголовками просто зациклите возвращенные строки и отслеживайте категорию, в которой вы находитесь. Всякий раз, когда категория текущей строки отличается от предыдущей, вы печатаете новую h1 для новой категории и обновите сохраненную «текущую» категорию.

0 голосов
/ 25 сентября 2011

Разве вам не нужно просто использовать GROUP BY category_uid?

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