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

8nuwlpux  于 12个月前  发布在  Mysql
关注(0)|答案(3)|浏览(123)

我试图找到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

fv2wmkja

fv2wmkja1#

我会使用这个查询:

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

mu0hgdu0

mu0hgdu02#

@fthiella的解决方案非常优雅。
如果将来你想显示超过user_id的数据,你可以使用joins,在一行中可以有你需要的所有数据。
如果你想使用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_id强烈建议使用和索引,并建议使用meta_key AND 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       |
 +---------+


所以应该能用。

watbbzwu

watbbzwu3#

选择表结构时,最大的数据灵活性是首选的。这种结构的缺点是效率会受到影响,表通常会因数据而变得非常臃肿,并且查询表通常涉及使用称为“pivot”的技术的聚合函数。
下面是如何使用pivot来执行查询:(db-fiddle demo

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列分组。在这样做的过程中,形成了一个临时的一对多关系。换句话说,每个user_id将有一个或多个行的数据(非线性,非平面),可以由MySQL的聚合函数(例如MAX())查询。
HAVING子句是筛选器逻辑必须在GROUP BY之后的位置(WHERE过滤发生在GROUP BY之前)。在“数据集群”中,您可以通过检查其meta_key来隔离数据。当您找到与meta_key匹配的行时,您可以使用其meta_value,如果没有,则分配一个不同的默认值。在聚合中的所有行都被IF处理之后,您知道您正在查找的行是非NULL值--这是通过调用MAX()访问的。使用此max值与您正在筛选的 actual 值进行比较。根据需要重复此筛选以满足您的业务逻辑。
我还应该声明,你没有使用安全的编码实践。mysql_query()目前已被弃用,无论出于何种原因,都不应该存在于任何当前的代码中。我建议你使用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;

相关问题