Подзапрос с использованием результата из родительского запроса - PullRequest
0 голосов
/ 27 апреля 2020

ОБНОВЛЕНИЕ Платежный запрос теперь решается с помощью, предоставленной в ответах. Ответ Клубники очень близок. Его просто нужно немного отредактировать, так как предложение WHERE содержит избыточность и неправильное утверждение, которое я предоставил в своем исходном запросе. Вот правильный, немного пересмотренный запрос:

SELECT ux.user_id
     , ux.meta_value pay
  FROM wp_um_groups_members m
  Join wp_usermeta ux 
    ON m.user_id1 = ux.user_id
 WHERE ux.meta_key = CONCAT('_um_groups_', m.group_id,'_price')

Это соответствует следующим данным для моего поля 'Pay':

From up_usermeta:

umeta_id | user_id | meta_key               |    meta_value
===========================================================
622680   | 5989    | _um_groups_47652_price |    500


From wp_um_groups_members:

id   | group_id | user_id1 | user_id2 | status   | role   | invites | time_stamp          | date_joined
===============================================================================================================
187  | 47682    | 5989     | 3        | approved | member | 1       | 2020-02-15 10:59:08 | 2020-02-15 10:59:08

Я перехожу к этому с моим исходным запросом ниже, и все работает.

Исходное сообщение

Я уверен, что делаю это намного сложнее, чем нужно. Ниже приведена схема и запрос. Когда я добавляю запрос Pay, я получаю результаты, которые не соответствуют правильно. Если я удаляю подзапрос «Оплатить», он работает нормально (за исключением того, что нет оплаты).

flow chart of query

В базе данных у меня есть много записей в wp_usermeta.meta_value, таких как: meta_value = _um_groups_47859_price

В этом примере число 47859 равно значению wp_um_groups_members.group_id

Поэтому я надеялся, что смогу запросить точное совпадение, используя что-то похожее на: LIKE CONCAT('%', wp_um_groups_members.group_id ,'%')

Это тоже не сработало.

Вот мой текущий запрос:

SELECT 
  wp_um_groups_members.group_id AS ID, wp_posts.post_title AS Gig, Location.Location, Type.`Event Type`, wp_users.display_name AS Player, Date.Date, Pay.Pay
FROM
  wp_um_groups_members
Inner Join wp_posts ON 
  wp_um_groups_members.group_id = wp_posts.ID
Inner Join (SELECT 
  wp_postmeta.post_id, wp_postmeta.meta_value AS Location
FROM
  wp_postmeta
WHERE
  wp_postmeta.meta_key = '_um_groups_event_location'
) Location ON 
  Location.post_id = wp_posts.ID
Inner Join (SELECT 
  wp_postmeta.post_id, wp_postmeta.meta_value AS `Event Type`
FROM
  wp_postmeta
WHERE
  wp_postmeta.meta_key = '_um_groups_event_type'
) Type ON 
  Type.post_id = wp_posts.ID
Inner Join wp_users ON 
  wp_users.ID = wp_um_groups_members.user_id1
Inner Join (SELECT 
  wp_postmeta.post_id, wp_postmeta.meta_value AS Date
FROM
  wp_postmeta
WHERE
  wp_postmeta.meta_key = '_um_groups_event_start'
) Date ON 
  Date.post_id = wp_posts.ID
Inner Join (SELECT 
  wp_usermeta.user_id, wp_usermeta.meta_value AS Pay
FROM
  wp_um_groups_members
Inner Join wp_usermeta ON 
  wp_um_groups_members.user_id1 = wp_usermeta.user_id
WHERE
  wp_usermeta.meta_key like '%price'
) Pay ON 
  Pay.user_id = wp_users.ID
WHERE
  wp_um_groups_members.status = 'approved'

Есть ли способ изменить это последнее Внутреннее объединение, чтобы оно содержало что-то вроде: WHERE wp_usermeta.meta_value = '_um_groups_47859_price', в котором 47859 был бы wp_um_groups_members.group_id?

1 Ответ

1 голос
/ 27 апреля 2020
SELECT ux.user_id
     , ux.meta_value pay
  FROM wp_um_groups_members m
  Join wp_usermeta ux 
    ON m.user_id1 = ux.user_id
 WHERE ux.meta_key LIKE '%price'
   AND ux.meta_value = CONCAT('_um_groups_', m.group_id,'_price')

Между прочим, хотя при работе с EAV (например, wp_postmeta) нет никакого выигрыша в производительности, я предпочитаю этот синтаксис ...

SELECT post_id
     , MAX(CASE WHEN meta_key = '_um_groups_event_location' THEN meta_value END) location
     , MAX(CASE WHEN meta_key = '_um_groups_event_type' THEN meta_value END) event_type
     , MAX(CASE WHEN meta_key = '_um_groups_event_start' THEN meta_value END) date
     , MAX(CASE WHEN meta_key = '_um_groups_event_type' THEN meta_value END) event_type
  FROM wp_postmeta
 GROUP
     BY post_id

(Строго говоря, это больше похоже на использование СЛЕДУЮЩЕЕ ПРИСОЕДИНЯЙТЕСЬ, ЧЕМ ВНУТРЕННЕЕ СОЕДИНЕНИЕ, согласно вашему примеру)

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