sourcecode

워드프레스 SQL은 X 제품에 대한 사용자의 이름과 성을 쿼리합니까?

copyscript 2023. 9. 26. 22:28
반응형

워드프레스 SQL은 X 제품에 대한 사용자의 이름과 성을 쿼리합니까?

우커머스 샵에서 다운로드 가능한 제품을 구매한 고객의 전체 이름과 이메일을 보여주고 싶은 SQL 쿼리를 만들고 있습니다.저는 이런 것을 찾고 있습니다.

user_id    first_name    last_name    user_email    order
---------------------------------------------------------
1          Peter         Jones        a12@gmail     Doc_1

위 표에서 Doc_1은 상품명을 의미하며, 이 경우 user_id = 1인 고객은 Doc_1을 다운로드 받을 수 있습니다.워드프레스 사용자의 경우 표가wp_usermeta에는 모든 사용자 정보가 포함되어 있으며 다음과 같습니다.

umeta_id    user_id    meta_key    meta_value
---------------------------------------------
1           1          nickname    petjon123
2           1          first_name  Peter
3           1          last_name   Jones
...         ...        ...         ...

이 은 더 를 .meta_value[s]이메일 등을 포함하여 모든 것이 더 쉬웠을 것입니다가 있었다면 이 훨씬 입니다.meta_key[s]다음을 표시하는 테이블 머리글일 것입니다.first_name그리고.last_name서로 위로가 아니라 서로 옆에 있습니다. 질문이.first_name, 하지만 나는 그것을 얻는 데 어려움을 겪고 있습니다.last_name SQL 조회는 다음과 같습니다.

SELECT
  wp_usermeta.user_id,
  wp_usermeta.meta_value AS 'first_name',
  Wp_woocommerce_downloadable_product_permissions_1.user_email AS 'email',
  Wp_woocommerce_order_items_1.order_item_name AS 'order'
FROM Wp_woocommerce_order_items
     INNER JOIN Wp_woocommerce_downloadable_product_permissions
       ON Wp_woocommerce_order_items.order_id = Wp_woocommerce_downloadable_product_permissions.order_id,
     (Wp_woocommerce_order_items AS Wp_woocommerce_order_items_1
     INNER JOIN Wp_woocommerce_downloadable_product_permissions AS Wp_woocommerce_downloadable_product_permissions_1
       ON Wp_woocommerce_order_items_1.order_id = Wp_woocommerce_downloadable_product_permissions_1.order_id)
     INNER JOIN wp_usermeta
       ON Wp_woocommerce_downloadable_product_permissions_1.user_id = wp_usermeta.user_id
GROUP BY wp_usermeta.user_id,
         wp_usermeta.meta_value,
         Wp_woocommerce_downloadable_product_permissions_1.user_email,
         Wp_woocommerce_order_items_1.order_item_name,
         Wp_woocommerce_order_items_1.order_item_type,
         wp_usermeta.meta_key
HAVING (((Wp_woocommerce_order_items_1.order_item_type) = 'line_item')
AND ((wp_usermeta.meta_key) = 'first_name'));

이 결과는 다음과 같습니다.

user_id    first_name    user_email    order
--------------------------------------------
1          Peter         a12@gmail     Doc_1

이 값들을 수동으로 확인해보니 맞지만, 결과를 그룹화하지 않으면 1000배의 결과가 나오기 때문에 데이터를 그룹화하면 기본적으로 중복을 제거하여 결과를 단순화할 수 있는데, 이는 명백히 과도한 것입니다.결과가 나타날 때까지의 실행 시간이 +/-20368.14ms이고 이 코드를 개선하는 제안에 매우 열려 있다는 점을 고려할 때 이 쿼리가 효율적인지 의문이 듭니다.이 말을 듣고, 저는 제가 다른 질문을 해야만 그 결과를 얻을 수 있다고 생각했습니다.last_name이것을 중첩 쿼리로 만듭니다.MS Access에서 테이블을 열면 위의 쿼리인 Query1을 생성하고 Query1에 내가 원하는 결과를 얻을 수 있는 테이블로 가입합시다.이를 위한 SQL 코드는 다음과 같습니다.

SELECT
  Query1.user_id,
  Query1.first_name,
  wp_usermeta.meta_value AS 'last_name',
  Query1.user_email,
  Query1.order_item_name
FROM wp_usermeta
INNER JOIN Query1
  ON wp_usermeta.user_id = Query1.user_id
WHERE (((wp_usermeta.meta_value) <> '')
AND ((wp_usermeta.meta_key) = 'last_name'));

쿼리 1의 코드를 동봉하여 괄호를 사용하여 쿼리 1을 대체하려고 했지만 작동하지 않았습니다.다음 오류가 발생합니다.

SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 설명서에서 '.user_id' 근처에 사용할 올바른 구문을 확인하십시오.(22행에서 SELECT wp_usermeta.user_id, wp_usermeta.meta_value AS 'first')

이거 할 줄 아는 사람?감사합니다!!


갱신하다

@Hogan이 제공한 답변에 따라 다음과 같이 생각했습니다.

SELECT
  first.user_id,
  first.meta_value AS 'first_name',
  last.meta_value AS 'last_name',
  Wp_woocommerce_downloadable_product_permissions_1.user_email,
  Wp_woocommerce_order_items_1.order_item_name
FROM Wp_woocommerce_order_items
     INNER JOIN Wp_woocommerce_downloadable_product_permissions
       ON Wp_woocommerce_order_items.order_id = Wp_woocommerce_downloadable_product_permissions.order_id,
     wp_usermeta AS last
     INNER JOIN ((Wp_woocommerce_order_items AS Wp_woocommerce_order_items_1
     INNER JOIN Wp_woocommerce_downloadable_product_permissions AS Wp_woocommerce_downloadable_product_permissions_1
       ON Wp_woocommerce_order_items_1.order_id = Wp_woocommerce_downloadable_product_permissions_1.order_id)
     INNER JOIN wp_usermeta AS first
       ON Wp_woocommerce_downloadable_product_permissions_1.user_id = first.user_id)
       ON last.user_id = Wp_woocommerce_downloadable_product_permissions_1.user_id
GROUP BY first.user_id,
         first.meta_value,
         last.meta_value,
         Wp_woocommerce_downloadable_product_permissions_1.user_email,
         Wp_woocommerce_order_items_1.order_item_name,
         Wp_woocommerce_order_items_1.order_item_type,
         first.meta_key,
         last.meta_key
HAVING (((Wp_woocommerce_order_items_1.order_item_type) = 'line_item')
AND ((first.meta_key) = 'first_name')
AND ((last.meta_key) = 'last_name'));

Which works perfectly fine in MS Access but in SQL it does not. I am getting this error:

Unknown column 'first.meta_key' in 'having clause'

Why?

또한 제가 언급해야 할 것은, 제가 추가할 때.meta_key[s]에게SELECT다음과 같이:

SELECT
  first.user_id,
  first.meta_value AS 'first_name',
  last.meta_value AS 'last_name',
  Wp_woocommerce_downloadable_product_permissions_1.user_email,
  Wp_woocommerce_order_items_1.order_item_name,
  first.meta_key,
  last.meta_key

I at least get no error, the query is running but it goes on and on increasing my CPU usage drastically given that I am working on a localhost.


SOLUTION

SELECT DISTINCT속임수를 썼습니다.그룹핑 없음. 쿼리 결과는 127.76ms로 나타납니다.제 질문은 이렇습니다.

SELECT DISTINCT
  first.user_id AS 'id',
  first.meta_value AS 'first_name',
  last.meta_value AS 'last_name',
  Wp_woocommerce_downloadable_product_permissions_1.user_email AS 'email',
  Wp_woocommerce_order_items_1.order_item_name AS 'order'
FROM Wp_woocommerce_order_items
     INNER JOIN Wp_woocommerce_downloadable_product_permissions
       ON Wp_woocommerce_order_items.order_id = Wp_woocommerce_downloadable_product_permissions.order_id,
     ((Wp_woocommerce_order_items AS Wp_woocommerce_order_items_1
     INNER JOIN Wp_woocommerce_downloadable_product_permissions AS Wp_woocommerce_downloadable_product_permissions_1
       ON Wp_woocommerce_order_items_1.order_id = Wp_woocommerce_downloadable_product_permissions_1.order_id)
     INNER JOIN wp_usermeta AS first
       ON Wp_woocommerce_downloadable_product_permissions_1.user_id = first.user_id)
     INNER JOIN wp_usermeta AS last
       ON Wp_woocommerce_downloadable_product_permissions_1.user_id = last.user_id
WHERE (((first.meta_key) = 'first_name')
AND ((last.meta_key) = 'last_name')
AND ((Wp_woocommerce_order_items_1.order_item_type) = 'line_item'));

@Hogan이 말한 것처럼 테이블을 추가하기만 하면 됩니다.wp_usermeta또 다른 가명을 사용해서, 또 다른 이름을 짓습니다.INNER JOIN.

Try this:

SELECT DISTINCT
  pp.user_id,
  first.meta_value AS 'first_name',
  last.meta_value AS 'last_name',
  pp.user_email AS 'email',
  oi.order_item_name AS 'order'
FROM
  Wp_woocommerce_order_items oi
INNER JOIN
  Wp_woocommerce_downloadable_product_permissions pp ON pp.order_id = oi.order_id
INNER JOIN
  wp_usermeta first ON first.user_id = pp.user_id
INNER JOIN
  wp_usermeta last ON last.user_id = pp.user_id
WHERE first.meta_key = 'first_name'
AND last.meta_key = 'last_name'
AND oi.order_item_type = 'line_item'

add this join

INNER JOIN wp_usermeta AS last 
    ON Wp_woocommerce_downloadable_product_permissions_1.user_id = last.user_id AND last.meta_key = 'last_name'

and the column

last.meta_value AS 'last_name',

당신은 아마 그 일에 너무 열광할 필요가 없을 겁니다.()-- 하위 쿼리를 수행하거나(사용자가 수행하지 않거나) 왼쪽 및 오른쪽 조인을 혼합하는 경우(사용자가 수행하지 않는 경우)가 아니라면 순서는 중요하지 않습니다.

ReferenceURL : https://stackoverflow.com/questions/36990165/wordpress-sql-query-the-users-first-last-name-for-product-x

반응형