source

wp_usermeta 테이블의 여러 행에 적격 데이터가 있는 사용자를 선택합니다.

manycodes 2022. 12. 25. 09:44
반응형

wp_usermeta 테이블의 여러 행에 적격 데이터가 있는 사용자를 선택합니다.

저는 지금 찾고 있는 중입니다.user_id데이터베이스 테이블의 다른 행에 각각 있는4개의 수식값이 모두 있습니다.

문의하는 테이블은 다음과 같습니다.

Field       Type                   Null    Key    Default    Extra
---------------------------------------------------------------------------
umeta_id    bigint(20) unsigned            PRI               auto_increment
user_id     bigint(20) unsigned            IND    0  
meta_key    varchar(255)           Yes     IND    NULL   
meta_value  longtext               Yes            NULL   

MySQL 쿼리를 작성했지만 결과가 비어 있어 작동하지 않는 것 같습니다.

$result = mysql_query(
     "SELECT user_id 
      FROM wp_usermeta 
      WHERE 
         (meta_key = 'first_name' AND meta_value = '$us_name') AND         
         (meta_key = 'yearofpassing' AND meta_value = '$us_yearselect') AND 
         (meta_key = 'u_city' AND meta_value = '$us_reg') AND 
         (meta_key = 'us_course' AND meta_value = '$us_course')"
);

반품 방법user_id이 4개의 행에 관련된 것인가요?

다음 쿼리를 사용합니다.

SELECT
  user_id
FROM
  wp_usermeta 
WHERE 
  (meta_key = 'first_name' AND meta_value = '$us_name') OR 
  (meta_key = 'yearofpassing' AND meta_value = '$us_yearselect') OR 
  (meta_key = 'u_city' AND meta_value = '$us_reg') OR
  (meta_key = 'us_course' AND meta_value = '$us_course')
GROUP BY
  user_id
HAVING
  COUNT(DISTINCT meta_key)=4

모두 선택됩니다.user_id이 네 가지 조건을 모두 충족합니다.

@fthiella의 솔루션은 매우 우아합니다.

앞으로 더 많은 것을 보여주고 싶다면user_idjoin을 사용하면 필요한 모든 데이터를 한 줄에 표시할 수 있습니다.

사용하고 싶은 경우AND조건 및 조건이 표에 여러 줄로 표시되어 있습니다.JOINS예:

SELECT `w_name`.`user_id` 
     FROM `wp_usermeta` as `w_name`
     JOIN `wp_usermeta` as `w_year` ON `w_name`.`user_id`=`w_year`.`user_id` 
          AND `w_name`.`meta_key` = 'first_name' 
          AND `w_year`.`meta_key` = 'yearofpassing' 
     JOIN `wp_usermeta` as `w_city` ON `w_name`.`user_id`=`w_city`.user_id 
          AND `w_city`.`meta_key` = 'u_city'
     JOIN `wp_usermeta` as `w_course` ON `w_name`.`user_id`=`w_course`.`user_id` 
          AND `w_course`.`meta_key` = 'us_course'
     WHERE 
         `w_name`.`meta_value` = '$us_name' AND         
         `w_year`.meta_value   = '$us_yearselect' AND 
         `w_city`.`meta_value` = '$us_reg' AND 
         `w_course`.`meta_value` = '$us_course'

기타: 준비된 스테이트먼트를 사용하는 것을 권장합니다.mysql_*함수는 SQL 주입 저장 기능이 아니므로 더 이상 사용되지 않습니다.코드를 가능한 한 적게 변경하고 싶다면mysqli_기능: http://php.net/manual/en/book.mysqli.php

권장 사항:

이 표의 인덱스를 사용합니다. user_idbe와 인덱스를 강력히 추천하며, 또한 be와 인덱스를 추천한다.meta_key그리고.meta_value또한 빠른 쿼리 실행을 위해 사용됩니다.

설명:

사용하시는 경우AND한 줄에 대한 조건을 '연결'합니다.따라서 여러 줄의 AND 조건을 사용하려면 먼저 다음과 같이 여러 줄에서 한 줄을 작성해야 합니다.

검정: 표 데이터:

          PRIMARY                 INDEX
      int       varchar(255)    varchar(255)
       /                \           |
  +---------+---------------+-----------+
  | user_id | meta_key      | meta_value|
  +---------+---------------+-----------+
  | 1       | first_name    | Kovge     |
  +---------+---------------+-----------+
  | 1       | yearofpassing | 2012      |
  +---------+---------------+-----------+
  | 1       | u_city        | GaPa      |
  +---------+---------------+-----------+
  | 1       | us_course     | PHP       |
  +---------+---------------+-----------+

쿼리 결과:$us_name='Kovge' $us_yearselect='2012' $us_reg='GaPa',$us_course='PHP':

 +---------+
 | user_id |
 +---------+
 | 1       |
 +---------+

효과가 있을 거야

UCM(Unified Content Model)이라고 하는 것으로 설계된 테이블을 쿼리하고 있습니다.이 테이블 구조는 데이터의 유연성을 최대한 높이는 것이 바람직할 때 선택됩니다.이 구조의 단점은 효율이 저하되고, 일반적으로 테이블이 데이터로 인해 매우 비대해지고, 일반적으로 "pivot"이라고 불리는 기술을 사용하여 집계 함수와 관련된 테이블을 쿼리하는 것입니다.

다음은 피벗을 사용하여 쿼리를 실행하는 방법입니다(db-fiddle 데모).

SELECT user_id 
FROM wp_usermeta
GROUP BY user_id
HAVING MAX(IF(meta_key = 'first_name', meta_value, NULL)) = 'mangesh'
   AND MAX(IF(meta_key = 'yearofpassing', meta_value, NULL)) = '2013'
   AND MAX(IF(meta_key = 'u_city', meta_value, NULL)) = 'n/a'
   AND MAX(IF(meta_key = 'us_course', meta_value, NULL)) = 'programming'

실제로 테이블 전체가 다음 순서로 그룹화 됩니다.user_id기둥.이를 통해 1대 다의 중간 관계가 형성된다.즉, 각각은user_id에는 MySQL의 집계 함수(예: 플랫이 아닌 비선형)로 조회할 수 있는 데이터(예: 1행 이상의 데이터)가 있습니다.MAX()를 참조해 주세요.

GROUP BY가 있다(GROUP BY가 있다)." 에서 "데이터 "를 하여 데이터를 할 수 .meta_key되었을 때meta_key.meta_value디폴트값의 구별을 지정합니다.이 「」에 됩니다.IF 있는 이외의을 알 수 은, 「NULL」을 호출하면 할 수 있습니다.이 값은 콜을 통해 액세스 됩니다.MAX()필터링 대상 실제 값과 비교하려면 이 최대값을 사용합니다.비즈니스 로직을 만족시키기 위해 필요한 만큼 이 필터를 반복합니다.

또한 안전한 코딩 방식을 사용하고 있지 않다는 점도 말씀드려야 합니다. mysql_query()는 현재 권장되지 않으며 어떠한 이유로도 현재 라이브코드에 존재할 수 없습니다.security.mysqli에 바인드된 하여 준비된 할 것을 합니다.

$sql = "SELECT user_id 
        FROM wp_usermeta
        GROUP BY user_id
        HAVING MAX(IF(meta_key = 'first_name', meta_value, NULL)) = ?
           AND MAX(IF(meta_key = 'yearofpassing', meta_value, NULL)) = ?
           AND MAX(IF(meta_key = 'u_city', meta_value, NULL)) = ?
           AND MAX(IF(meta_key = 'us_course', meta_value, NULL)) = ?";

$stmt = $conn->prepare($sql);
$stmt->bind_param('ssss', $us_name, $us_yearselect, $us_reg, $us_course);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($user_id);
$stmt->fetch();
echo $user_id;

언급URL : https://stackoverflow.com/questions/16249731/select-user-having-qualifying-data-on-multiple-rows-in-the-wp-usermeta-table

반응형