Я задавал этот вопрос раньше, но теперь нужно добавить больше полей, и тот же метод теперь истекает из-за слишком большого количества самостоятельных соединений.
Это мой текущий запрос. Это медленно, но достаточно производительно, когда я добавляю столбцы города и штата, но когда я добавляю столбец 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
Я не являюсь администратором базы данных и не имею разрешения на добавление индексов. Ни один из существующих индексов не относится к нужным мне столбцам.






Вы можете использовать агрегацию для выбора значений из структуры данных 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, даже если статус активен.
@ Ci-CiMillsThomson, можете ли вы задать новый вопрос, разместив свой исходный запрос с объединениями, а также включив образцы данных для ваших таблиц, которые были бы полезны, этот ответ относится к вашему запросу.
Какие индексы у вас есть на таблицах и как выглядит план выполнения?