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

8nuwlpux  于 2024-01-05  发布在  Mysql
关注(0)|答案(3)|浏览(147)

我试图找到user_id,它具有所有四个限定值--每个值位于数据库表的不同行中。
我正在查询的表是wp_usermeta

  1. Field Type Null Key Default Extra
  2. ---------------------------------------------------------------------------
  3. umeta_id bigint(20) unsigned PRI auto_increment
  4. user_id bigint(20) unsigned IND 0
  5. meta_key varchar(255) Yes IND NULL
  6. meta_value longtext Yes NULL

字符串
我写了一个MySQL查询,但它似乎不工作,因为结果是空的。

  1. $result = mysql_query(
  2. "SELECT user_id
  3. FROM wp_usermeta
  4. WHERE
  5. (meta_key = 'first_name' AND meta_value = '$us_name') AND
  6. (meta_key = 'yearofpassing' AND meta_value = '$us_yearselect') AND
  7. (meta_key = 'u_city' AND meta_value = '$us_reg') AND
  8. (meta_key = 'us_course' AND meta_value = '$us_course')"
  9. );


如何返回与这四行相关的user_id

fv2wmkja

fv2wmkja1#

我会使用这个查询:

  1. SELECT
  2. user_id
  3. FROM
  4. wp_usermeta
  5. WHERE
  6. (meta_key = 'first_name' AND meta_value = '$us_name') OR
  7. (meta_key = 'yearofpassing' AND meta_value = '$us_yearselect') OR
  8. (meta_key = 'u_city' AND meta_value = '$us_reg') OR
  9. (meta_key = 'us_course' AND meta_value = '$us_course')
  10. GROUP BY
  11. user_id
  12. HAVING
  13. COUNT(DISTINCT meta_key)=4

字符串
这将选择满足所有四个条件的所有user_id

展开查看全部
mu0hgdu0

mu0hgdu02#

@fthiella的解决方案非常优雅。
如果将来你想显示超过user_id的数据,你可以使用joins,在一行中可以有你需要的所有数据。
如果你想使用AND条件,并且条件在你的表中有多行,你可以使用JOINS示例:

  1. SELECT `w_name`.`user_id`
  2. FROM `wp_usermeta` as `w_name`
  3. JOIN `wp_usermeta` as `w_year` ON `w_name`.`user_id`=`w_year`.`user_id`
  4. AND `w_name`.`meta_key` = 'first_name'
  5. AND `w_year`.`meta_key` = 'yearofpassing'
  6. JOIN `wp_usermeta` as `w_city` ON `w_name`.`user_id`=`w_city`.user_id
  7. AND `w_city`.`meta_key` = 'u_city'
  8. JOIN `wp_usermeta` as `w_course` ON `w_name`.`user_id`=`w_course`.`user_id`
  9. AND `w_course`.`meta_key` = 'us_course'
  10. WHERE
  11. `w_name`.`meta_value` = '$us_name' AND
  12. `w_year`.meta_value = '$us_yearselect' AND
  13. `w_city`.`meta_value` = '$us_reg' AND
  14. `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条件,首先你必须从多行中创建一行,就像这样。
测试:表数据:

  1. PRIMARY INDEX
  2. int varchar(255) varchar(255)
  3. / \ |
  4. +---------+---------------+-----------+
  5. | user_id | meta_key | meta_value|
  6. +---------+---------------+-----------+
  7. | 1 | first_name | Kovge |
  8. +---------+---------------+-----------+
  9. | 1 | yearofpassing | 2012 |
  10. +---------+---------------+-----------+
  11. | 1 | u_city | GaPa |
  12. +---------+---------------+-----------+
  13. | 1 | us_course | PHP |
  14. +---------+---------------+-----------+


使用$us_name='Kovge'$us_yearselect='2012'$us_reg='GaPa'$us_course='PHP'查询的结果:

  1. +---------+
  2. | user_id |
  3. +---------+
  4. | 1 |
  5. +---------+


所以应该能用。

展开查看全部
watbbzwu

watbbzwu3#

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

  1. SELECT user_id
  2. FROM wp_usermeta
  3. GROUP BY user_id
  4. HAVING MAX(IF(meta_key = 'first_name', meta_value, NULL)) = 'mangesh'
  5. AND MAX(IF(meta_key = 'yearofpassing', meta_value, NULL)) = '2013'
  6. AND MAX(IF(meta_key = 'u_city', meta_value, NULL)) = 'n/a'
  7. 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的面向对象语法,并实现一个带有绑定参数的预准备语句,以确保安全性/稳定性。

  1. $sql = "SELECT user_id
  2. FROM wp_usermeta
  3. GROUP BY user_id
  4. HAVING MAX(IF(meta_key = 'first_name', meta_value, NULL)) = ?
  5. AND MAX(IF(meta_key = 'yearofpassing', meta_value, NULL)) = ?
  6. AND MAX(IF(meta_key = 'u_city', meta_value, NULL)) = ?
  7. AND MAX(IF(meta_key = 'us_course', meta_value, NULL)) = ?";
  8. $stmt = $conn->prepare($sql);
  9. $stmt->bind_param('ssss', $us_name, $us_yearselect, $us_reg, $us_course);
  10. $stmt->execute();
  11. $stmt->store_result();
  12. $stmt->bind_result($user_id);
  13. $stmt->fetch();
  14. echo $user_id;

展开查看全部

相关问题