Группировка, Заказ по работал в MySQL, но не MariaDB - PullRequest
0 голосов
/ 20 ноября 2018

Некоторое время назад нам удалось обработать некоторые действительно сложные (для нас) запросы к базе данных, которые включают некоторые динамические мета-значения в общую информацию Post в WordPress, так что в результате получился хороший полный список пар ключ => значение. Он работал отлично в течение многих лет, но теперь мы перешли на MariaDB, и он больше не делает заказ правильно, и я не уверен, почему. Ниже приведен один из больших, длинных примеров или снимок экрана в https://screencast.com/t/mFILYpWf для более подробного форматирования.

Любые идеи о том, как я могу получить его в порядке, сначала menu_order, фамилия, затем first_name?

Спасибо как всегда !!

SELECT *
FROM
(
    SELECT wp_posts.ID, wp_posts.menu_order, wp_posts.post_title,
        wp_posts.post_name,
        MAX(CASE WHEN wp_postmeta.meta_key = 'lawyer_job_title'
                 THEN wp_postmeta.meta_value END ) AS 'job_title',
        MAX(CASE WHEN wp_postmeta.meta_key = 'lawyer_prefix'
                 THEN wp_postmeta.meta_value END ) AS 'prefix',
        MAX(CASE WHEN wp_postmeta.meta_key = 'lawyer_first_name'
                 THEN wp_postmeta.meta_value END ) AS 'first_name',
        MAX(CASE WHEN wp_postmeta.meta_key = 'lawyer_middle_name'
                 THEN wp_postmeta.meta_value END ) AS 'middle_name',
        MAX(CASE WHEN wp_postmeta.meta_key = 'lawyer_last_name'
                 THEN wp_postmeta.meta_value END ) AS 'last_name',
        MAX(CASE WHEN wp_postmeta.meta_key = 'lawyer_suffix'
                 THEN wp_postmeta.meta_value END ) AS 'suffix',
        MAX(CASE WHEN wp_postmeta.meta_key = 'lawyer_languages'
                 THEN wp_postmeta.meta_value END ) AS 'languages',
        MAX(CASE WHEN wp_postmeta.meta_key = 'lawyer_email'
                 THEN wp_postmeta.meta_value END ) AS 'email',
        MAX(CASE WHEN wp_postmeta.meta_key = 'lawyer_phone'
                 THEN wp_postmeta.meta_value END ) AS 'phone',
        MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_offices' THEN wp_postmeta.meta_value END ) AS 'offices',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_linkedin' THEN wp_postmeta.meta_value END ) AS 'linkedin',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_biography' THEN wp_postmeta.meta_value END ) AS 'biography',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_bio_field_credentials' THEN wp_postmeta.meta_value END ) AS 'bio_field_credentials',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_bio_field_affiliations' THEN wp_postmeta.meta_value END ) AS 'bio_field_affiliations',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_bio_field_accolades' THEN wp_postmeta.meta_value END ) AS 'bio_field_accolades',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_bio_field_notable_decisions' THEN wp_postmeta.meta_value END ) AS 'bio_field_notable_decisions',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_bio_field_education_admissions' THEN wp_postmeta.meta_value END ) AS 'bio_field_education_admissions',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_bio_image' THEN wp_postmeta.meta_value END ) AS 'bio_image',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_directory_image' THEN wp_postmeta.meta_value END ) AS 'directory_image',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_pdf_image' THEN wp_postmeta.meta_value END ) AS 'pdf_image',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_practices' THEN wp_postmeta.meta_value END ) AS 'practices',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_related_posts' THEN wp_postmeta.meta_value END ) AS 'related_posts',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_other_news' THEN wp_postmeta.meta_value END ) AS 'other_news',MAX( CASE WHEN wp_postmeta.meta_key = 'lawyer_related_staff' THEN wp_postmeta.meta_value END ) AS 'related_staff', concat( 'http://wiedner.localhost/lawyer/', wp_posts.post_name, '/' ) AS 'permalink' FROM wp_posts LEFT JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE wp_posts.post_status = 'publish' AND wp_posts.post_type = 'lawyer'
    GROUP BY wp_posts.ID
    ORDER BY menu_order asc, last_name asc, first_name asc
) AS t
WHERE 1=1

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Упростите это, избавившись от внешней SELECT!

Причина в том, что у «производной» таблицы (вашего подзапроса) нет порядка.(Это давно было в стандартном SQL, но только недавно использовалась MariaDB, а затем и MySQL, который воспользовался этим.) То есть выполнение оправдано, чтобы избавиться от ваших тщательно написанных ORDER BY.

Ноостановившись с внутренним запросом;он обязан соблюдать ORDER BY.

0 голосов
/ 20 ноября 2018

MariaDB может иметь другой режим. Попробуйте это, и посмотрите здесь :

 SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',));

Также это может быть дубликат, см. связанный вопрос.

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