Базовый вопрос группировки MySQL PHP - PullRequest
4 голосов
/ 05 января 2010

Быстрый вопрос, который, как мне кажется, имеет очень простое решение для тех, у кого есть что-то, превосходящее самые элементарные знания PHP / MySQL, как у меня.

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

  • Анкоридж, АК
  • Балтимор, MD
  • Чикаго, Иллинойс и т. д.

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

AK

  • Anchorage
  • Джуно

CA

  • Лос-Анджелес
  • Сан-Диего
  • Сан-Франциско
  • и т. Д.

Я знаю, что мне нужно что-то вроде foreach, и я искал в Интернете, но не нашел примера, по которому можно было бы приступить к работе.

Вот что мне нужно, чтобы вытащить основной список:

  $list = mysql_query("SELECT id, alphaname, state FROM regional ORDER BY alphaname",$db);

while ($thearray = mysql_fetch_array($list)) {
  echo "<li><a href='info.html?id=$thearray[id]'>$thearray[alphaname], $thearray[state]</a></li>";
  } 

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

Спасибо за любую помощь!

Обновление - решено. Я придерживался подхода Рокаколы, хотя я тоже работал.

Ответы [ 4 ]

4 голосов
/ 05 января 2010

Попробуйте это ..

Запросите все города с указанием штата, сначала по штатам, затем по городам:

SELECT id, alphaname, state 
FROM regional 
ORDER BY state ASC, alphaname ASC

Организовать ваш набор данных в 2-мерный массив:

$states = array();
while($thearray = mysql_fetch_array($list)) 
{
    $states[$thearray[state]][$thearray[id]] = $thearray[alphaname];
} 

Теперь содержимое вашего $states должно выглядеть примерно так:

Array
(
    [AK] => Array (
        [id_1] = Anchorage
        [id_2] = Juneau
    )
    [CA] => Array (
        [id_3] = Los Angeles
        [id_4] = San Diego
        [id_5] = San Francisco
    )
)

Создайте HTML-презентацию:

ПРИМЕЧАНИЕ. Добавьте привязку для отражения предложенного вопроса.

foreach($states as $state_name => $cities)
{
    echo '<h3>'.$state_name.'</h3>';
    echo '<ul>';
    foreach($cities as $id => $city_name)
    {
        echo '<li><a href="info.html?id='.$id.'">'.$city_name.'</a></li>';
    }
    echo '</ul>';
}
1 голос
/ 05 января 2010

Обновите ваш SQL-запрос для использования:

ORDER BY state, alphaname

Это заставит вашу базу данных возвращать результаты в виде:

state   city
------------------
AK      Anchorage
AK      Juneau

... при условии использования SELECT state, alphaname AS city для целей примера.

Презентация должна быть обработана на PHP:

//Please excuse my hideous attempt at PHP.  Better to think of it as Psuedo code
while ($thearray = mysql_fetch_array($list)) {
  echo $thearray[state]
  echo "<li><a href='info.html?id=$thearray[id]'>$thearray[alphaname]</a></li>";
}

... или вы можете посмотреть сообщение i-g.

0 голосов
/ 05 января 2010

SQL не вернет больше двухмерных данных. То, что вы хотите, это получить какую-нибудь сводную колонку. Ответом на вашу проблему является выборка всех строк с помощью:

SELECT * FROM regional ORDER BY state;

Затем сортируйте и группируйте, используя PHP (или по вашему выбору), но без SQL.

0 голосов
/ 05 января 2010

Сортировка всех строк по состоянию. Затем пройдитесь по всем строкам по порядку. В первой строке и в любой строке, состояние которой отличается от предыдущей строки, перед выводом названия города выведите имя штата.

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