Можно ли это сделать с помощью запроса (MySQL)? - PullRequest
0 голосов
/ 10 апреля 2020

PHP и MySQL

Это существующий проект с некачественным дизайном и разметкой таблиц, который был запрошен для добавления новой функции.

I Мне интересно, может ли такой запрос быть составлен (не самый большой с запросами)

Краткое резюме:

Форма сообщения сделана.

  • таблица получает messageid и (пустое) subid

, если сделано НОВОЕ сообщение .. выше повторяется ..

  • (messageid и a (пусто) subid)

если сделан комментарий к существующему сообщению ..

  • таблица получает идентификатор сообщения и subid, соответствующий сообщению / теме родительского сообщения он комментирует

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

Но:

  • Я знаю родительские посты (потому что subid col пуст)
  • Я знаю дочерние посты (потому что subid col имеет v alue, соответствующий родительскому сообщению, является комментарием к)
  • У всех сообщений есть временная метка.

Как получить запрос и сгруппировать / упорядочить такие вещи, как:

  • Выберите -parent posts- без subid
  • немедленно иметь все посты -child / comment- под этим

И имейте (изначально?) Порядок по родительской post_date затем дочерний элемент / комментарий (суб-порядок по их post_dates)

Вот пример таблицы настроек:

http://sqlfiddle.com/#! 9 / 19dae / 2/0

Не уверен, нужен ли здесь простой GROUP BY? Или нужно сделать более продвинутый выбор?

Порядок должен быть «первым» выполнен родительским постом «post_date» .. и (каким-то образом) получить следующие дочерние / комментирующие посты, которые будут «введены» после их «родительского» поста в запросе / массиве возвращение ..

Вот мой желаемый порядок результата:

Желаемый результат:

'2020-03-30 09:48:50', 'Poster A', '49203-30032020094850000000', ''
'2020-03-30 09:50:50', 'Poster B', '49204-30032020095050000000', '49203-30032020094850000000'
'2020-04-03 09:55:50', 'Poster C', '49205-03042020095550000000', '49203-30032020094850000000'
'2020-03-31 09:48:50', 'Poster C', '49205-31032020094850000000', ''
'2020-04-03 09:40:50', 'Poster B', '49204-03042020094050000000', '49206-010432020094850000000'
'2020-04-01 09:48:50', 'Poster D', '49206-010432020094850000000', ''
'2020-04-02 09:49:50', 'Poster E', '49207-02042020094950000000', ''

Обновление:

Адресация: @ N go Ван Quan

За его ответ.

Это:

select * from covid19_new 
order by
(
 CASE covid19_new.subid WHEN 0 
 THEN covid19_new.id*1000 
 ELSE covid19_new.subid*1000 + covid19_new.id END
), 
covid19_new.id;

(что я думаю, что вы намеревались предоставить вместо того, что вы отправили ??)

** ничего не делает

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Вот sql для выполнения ваших задач:

select * from table order by (CASE table.subid when 0 then bustrip.id*1000 ELSE table.subid*1000+table.id END), table.id"); $query->group ( 'table.id' );

0 голосов
/ 10 апреля 2020

Этот запрос не даст вам именно то, что вы ищете, но даст вам по крайней мере одну строку для каждого сообщения. Если комментариев нет, вы получите одну строку с кучей нулевой информации для комментариев. Если есть комментарии, вы получите одну строку на комментарий с повторением информации родительского поста:

SELECT * 
FROM testtable AS post 
LEFT JOIN testtable as `comment` ON `comment`.subid = post.messageid
WHERE post.subid = ''
ORDER BY post.postdate ASC;
...