选择在wp_usermeta表中的多行上具有合格数据的用户

2022-08-30 10:53:40

我正在尝试查找具有所有四个限定值的 - 每个值都在数据库表的不同行中。user_id

我正在查询的表wp_usermeta

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


答案 1

我会使用这个查询:

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


答案 2

@fthiella的解决方案非常优雅。

如果将来您想要显示比使用联接更多的数据,并且在一行中可能是您需要的所有数据。user_id

如果要使用条件,并且条件位于表中的多行中,则可以使用示例:ANDJOINS

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'

其他事项:建议使用预准备语句,因为函数不是SQL注入保存,并且将被弃用。如果要尽可能少地更改代码,可以使用函数:http://php.net/manual/en/book.mysqli.phpmysql_*mysqli_

建议:

在此表中使用索引。 强烈建议成为和索引,并建议也成为 AND,以便更快地运行查询。user_idmeta_keymeta_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       |
 +---------+

所以它应该有效。


推荐