#mysql
#mysql
Вопрос:
Исходная схема базы данных—
id username date Grade
----------------------------------------
1 Haryana 15/02/2001 A
2 Haryana 20/02/2008 B
3 Punjab 15/05/2001 A
4 Haryana 25/02/2008 A
5 Punjab 25/02/2008 B
Требуется вывод с помощью запроса выбора—
username date Grade username date Grade username date Grade
-------------------------------------------------------------------------------------------
haryana 15/02/2001 A Haryana 20/02/2008 B Haryana 25/02/2008 A
Punjab 15/05/2001 A Punjab 25/02/2008 B
Примечание->
В принципе, я хочу, чтобы имя столбца «username» использовалось для объединения нескольких строк пользователя «Haryana» в один кортеж с несколькими строками с несколькими столбцами.
Комментарии:
1. Серьезно подумайте о том, чтобы решить проблемы отображения данных в вашем коде уровня представления / уровня приложения, если такая вещь доступна; как правило, это быстрее и намного (и проще) масштабируемо и гибко. В противном случае см. Сводные запросы.
2. В принципе, у PHP не так много возможностей 🙂
3. Я не понимаю этот комментарий:- $
4. Как я уже сказал, я просто хочу отформатировать данные на основе столбца «имя пользователя». как указано выше
5. И вы используете какой-то ранг и @prev, которые у меня не работали…
Ответ №1:
Программное обеспечение для реляционных баз данных ужасно при создании наборов результатов (таблиц), в которых количество или имена столбцов зависят от данных в других таблицах. Это то, о чем вы просите. Это сложный код для написания и практически невозможный в обслуживании. Даже если вы заставите его работать в SQL, это будет жалкий взлом ™. Человек, который работает над этим после вас, проклянет вас.
Такие вещи, часто называемые сводными, лучше всего выполнять в клиентском программном обеспечении базы данных.
При этом, возможно, вы можете попробовать GROUP_CONCAT()
функцию агрегирования.
Вот возможный запрос.
SELECT GROUP_CONCAT(CONCAT_WS(' ', username,date, Grade) ORDER BY date SEPARATOR ' | ')
FROM table
GROUP BY username
Это даст результирующий набор, подобный этому:
Haryana 15/02/2001 A | Haryana 20/02/2008 B | Haryana 25/02/2008 A
Punjab 15/05/2001 A | Punjab 25/02/2008 B
Небольшая обработка строк на php или любом другом языке может преобразовать такой результат, создавая иллюзию, что он находится в таблице.
Комментарии:
1. Сэр, я хочу, чтобы у каждого столбца был свой собственный, как будто вы объединили каждый кортеж в один столбец.. Есть ли что-нибудь, что я могу сделать, чтобы достичь этого?
Ответ №2:
Я всерьез не защищаю это как решение (см. Первое предложение Олли или мой комментарий выше). Итак, просто для удовольствия…
SELECT username
, MAX(CASE WHEN rank = 1 THEN date END) date1
, MAX(CASE WHEN rank = 1 THEN grade END) grade1
, MAX(CASE WHEN rank = 2 THEN date END) date2
, MAX(CASE WHEN rank = 2 THEN grade END) grade2
, MAX(CASE WHEN rank = 3 THEN date END) date3
, MAX(CASE WHEN rank = 3 THEN grade END) grade3
FROM
(
SELECT x.*
, CASE WHEN @prev = username THEN @i:=@i 1 ELSE @i:=1 END rank
, @prev:=username
FROM my_table x
,(SELECT @prev:=null,@i:=0) vars
ORDER
BY username
, date
) a
GROUP
BY username;
Комментарии:
1. Но я не должен этого делать, в основном я хочу форматировать данные, возвращая их в одну строку для общего значения столбца, вот и все. Это всего лишь примерная таблица….
2. Послушайте, крайне неразумно пытаться делать то, что вы хотите, в SQL. Это жалкий взлом. Вам нужно сделать это на Php, или C #, или Crystal Reports, или в любом другом клиентском пакете, который у вас есть.