Сортировка результатов MySQL по значениям столбцов

0

пример

Ссылаясь на таблицу в прилагаемом изображении "Пример".

Наш гоночный клуб go kart использует программное обеспечение электронной коммерции для онлайн-регистрации. Каждая регистрация имеет уникальный номер в столбце coCartID. Затем все детали регистрации (Имя драйвера, Kart # и т.д. И т.д.) Имеют одинаковый статус в качестве параметров, поэтому все они отображаются в одном столбце coCartOption и идентифицируются заголовками в столбце coOptID.

Мне удалось отобразить отсортированный список последних регистраций:

$sql = "
SELECT coCartID, coOptGroup, coCartOption, coOptID
FROM cartoptions
WHERE coCartID > 2200 AND (coOptGroup = '*Driver Name:' OR coOptGroup = '*1st Class - $85:' OR coOptGroup = '1st Class - $100:' OR coOptGroup = '*1st Class Kart #:' OR coOptGroup = '1st Transponder #:' OR coOptGroup = '2nd Class - $25:' OR coOptGroup = '2nd Class Kart #:' OR coOptGroup = '2nd Transponder #:')
ORDER BY coCartID ASC, coOptID DESC
";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo $row["coOptGroup"] . $row["coCartOption"] . "<br>";
    }
} else {
echo "0 results";
}
$conn->close();
?> 

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

Kari Hillwig
33
Стартовая мировая формула
Арман Корнелл
9193664
Мастер 100cc
99
Фред Блаувельт
Стартовая мировая формула
77

ВОПРОС 1: Как объединить все записи с одним и тем же идентификатором coCartID и отобразить в одной строке. Я потратил несколько разочаровывающих часов на fetch_assoc, fetch_array, & fetch_row, но независимо от того, что я не могу получить перерыв, размещенный в правильном месте:

Кари Хиллвиг, старший мировой Формулы, 33
Арман Корнелл, 100cc Мастер, 99, 9193664
Фред Блаувельт, старший мировой Формула, 77

ВОПРОС 2: Помимо ASC или DESC, можно ли отсортировать данные coOptID в определенном порядке? (Если это так, я могу отобразить соответствующие данные coCartOption в том же порядке).

Заранее спасибо,

Теги:
sorting

2 ответа

0
Лучший ответ

Вы можете использовать следующий запрос для получения строки данных для каждого coCartID для фиксированного номера. of coOptGroup (s)

SELECT coCartID,
MAX(CASE WHEN coOptGroup = '*Driver Name:' THEN coCartOption ELSE NULL END) DriverName,
MAX(CASE WHEN coOptGroup IN('*1st Class - $85:','1st Class - $100:' ) THEN coCartOption ELSE NULL END) 1stClass,
MAX(CASE WHEN coOptGroup = '*1st Class Kart #:' THEN coCartOption ELSE NULL END) 1stClassKart,
MAX(CASE WHEN coOptGroup = '1st Transponder #:' THEN coCartOption ELSE NULL END) 1stClassTransponder,
MAX(CASE WHEN coOptGroup ='2nd Class - $25:'  THEN coCartOption ELSE NULL END) 2ndClass,
MAX(CASE WHEN coOptGroup = '2nd Class Kart #:' THEN coCartOption ELSE NULL END) 2ndClassKart,
MAX(CASE WHEN coOptGroup = '2nd Transponder #:' THEN coCartOption ELSE NULL END) 2ndClassTransponder
FROM cartoptions
WHERE coCartID > 2200
AND (coOptGroup = '*Driver Name:' 
    OR coOptGroup = '*1st Class - $85:' 
    OR coOptGroup = '1st Class - $100:' 
    OR coOptGroup = '*1st Class Kart #:' 
    OR coOptGroup = '1st Transponder #:' 
    OR coOptGroup = '2nd Class - $25:' 
    OR coOptGroup = '2nd Class Kart #:' 
    OR coOptGroup = '2nd Transponder #:'
)
GROUP BY coCartID
ORDER BY coCartID ASC

DEMO

когда вы выполняете над запросом, вы будете все значения, связанные с единственным coCartID в $row как $row["DriverName"], $row['1stClass']... в каждой итерации цикла

  • 0
    @M Khalid Junaid Спасибо ... Я слежу за вашим SQL, но я немного запутался в том, что для Echo отображать правильно.
  • 0
    @ седьмая передача, я обновил свой ответ, надеюсь, это имеет смысл
Показать ещё 1 комментарий
0

Я бы сделал это, используя GROUP_CONCAT() с параметрами ORDER BY и SEPARATOR, и IN в WHERE.

Демо: http://sqlfiddle.com/#!9/141e5f/6

SELECT GROUP_CONCAT(coCartOption
ORDER BY
    FIELD (coOptGroup,
           '*Driver Name:',
           '*1st Class - $85:',
           '1st Class - $100:',
           '*1st Class Kart #:',
           '1st Transponder #:',
           '2nd Class - $25:',
           '2nd Class Kart #:',
           '2nd Transponder #:')
    SEPARATOR ', ') AS csv
FROM cartoptions
WHERE coCartID>2200 AND 
      coCartOption!='(N/A)' AND
      coOptGroup IN (
          '*Driver Name:',
          '*1st Class - $85:',
          '1st Class - $100:',
          '*1st Class Kart #:',
          '1st Transponder #:',
          '2nd Class - $25:',
          '2nd Class Kart #:',
          '2nd Transponder #:')
GROUP BY coCartID
ORDER BY coCartID

Этот запрос должен быть достаточно простым для понимания и обновления в будущем.

См. Мою демонстрационную ссылку для чистого трехстрочного набора с одним столбцом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню