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

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

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

SELECT um.user_id, 
       users.display_name, 
       GROUP_CONCAT(um.meta_value SEPARATOR ' '),
       city.meta_value,
       state.meta_value,
       zip.meta_value
FROM `wp_7bv88z_usermeta` um, 
     `wp_7bv88z_pmpro_memberships_users` u, 
     `wp_7bv88z_users` users,
     `wp_7bv88z_usermeta` lname,
     `wp_7bv88z_usermeta` fname,
     `wp_7bv88z_usermeta` city,
     `wp_7bv88z_usermeta` state,
     `wp_7bv88z_usermeta` zip
WHERE u.user_id = um.user_id 
     and users.id = u.user_id 
     and (lname.user_id = u.user_id and lname.meta_key = 'pmpro_slastname')
     and (fname.user_id = u.user_id and fname.meta_key = 'pmpro_sfirstname')
     and (city.user_id = u.user_id and city.meta_key = 'pmpro_scity')
     and (state.user_id = u.user_id and state.meta_key = 'pmpro_sstate')
     and (zip.user_id = u.user_id and zip.meta_key = 'pmpro_szipcode')
     and (um.meta_key='pmpro_sfirstname' or um.meta_key='pmpro_slastname') 
     and u.status='active'
GROUP BY lname.meta_value, fname.meta_value, city.meta_value, 
         state.meta_value, zip.meta_value, um.user_id

Пример данных:

таблица user_meta

╔════=====╦══════════════==╦══════=======╗
║ user_id ║  meta_key        ║ meta_value  ║
╠════=====╬══════════════==╬══════=======╣
║  1      ║ pmpro_sfirstname ║ Jeff        ║
║  1      ║ pmpro_slasttname ║ Atwood      ║
║  1      ║ pmpro_scity      ║ Chicago     ║
║  1      ║ pmpro_sstate     ║ IL          ║
║  1      ║ pmpro_szip       ║ 60007       ║
║  2      ║ pmpro_sfirstname ║ Geoff       ║
║  2      ║ pmpro_slasttname ║ Davis       ║
║  2      ║ pmpro_scity      ║ Fairfax     ║
║  2      ║ pmpro_sstate     ║ VA          ║
║  2      ║ pmpro_szip       ║ 22030       ║
║  3      ║ pmpro_sfirstname ║ Jarrod      ║
║  3      ║ pmpro_slasttname ║ Minor       ║
║  3      ║ pmpro_scity      ║ Dallas      ║
║  3      ║ pmpro_sstate     ║ TX          ║
║  3      ║ pmpro_szip       ║ 75001       ║
║  4      ║ pmpro_sfirstname ║ Joel        ║
║  4      ║ pmpro_slasttname ║ Brown       ║
║  4      ║ pmpro_scity      ║ Boston      ║
║  4      ║ pmpro_sstate     ║ MA          ║
║  4      ║ pmpro_szip       ║ 02101       ║
╚════=====╩════════════=====╩══════======╝

Ожидаемые результаты:

1, Jeff Atwood, Chicago, IL, 60007
4, Joel Brown, Fairfax, VA, 22030
2, Geoff Davis, Dallas, TX, 75001
3, Jarrod Minor, Boston, MA, 02101

Какие индексы у вас есть на таблицах и как выглядит план выполнения?

sticky bit 15.06.2018 12:41

Я не являюсь администратором базы данных и не имею разрешения на добавление индексов. Ни один из существующих индексов не относится к нужным мне столбцам.

cicit 19.06.2018 13:07
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать агрегацию для выбора значений из структуры данных EAV

select  user_id,
        max( case when meta_key = 'pmpro_sfirstname' then meta_value else null end) fname,
        max( case when meta_key = 'pmpro_slasttname' then meta_value else null end) lname,
        max( case when meta_key = 'pmpro_scity' then meta_value else null end) city,
        max( case when meta_key = 'pmpro_sstate' then meta_value else null end) state,
        max( case when meta_key = 'pmpro_szip' then meta_value else null end) zip
from user_meta
group by user_id

Демо

Это работает для одной таблицы. Я включил только образцы данных для этого, но на самом деле в исходном запросе есть 3 соединения. Я получаю кучу строк, которые имеют значение NULL, даже если статус активен.

cicit 19.06.2018 13:48

@ Ci-CiMillsThomson, можете ли вы задать новый вопрос, разместив свой исходный запрос с объединениями, а также включив образцы данных для ваших таблиц, которые были бы полезны, этот ответ относится к вашему запросу.

M Khalid Junaid 19.06.2018 13:50

Другие вопросы по теме