我试图找到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
?
3条答案
按热度按时间fv2wmkja1#
我会使用这个查询:
字符串
这将选择满足所有四个条件的所有
user_id
。mu0hgdu02#
@fthiella的解决方案非常优雅。
如果将来你想显示超过
user_id
的数据,你可以使用joins,在一行中可以有你需要的所有数据。如果你想使用
AND
条件,并且条件在你的表中有多行,你可以使用JOINS
示例:字符串
还有一件事:建议使用预处理语句,因为
mysql_*
函数不是SQL注入保存,并且将被弃用。如果您希望尽可能少地更改代码,可以使用mysqli_
函数:http://php.net/manual/en/book.mysqli.php建议:
在此表中使用索引。
user_id
强烈建议使用和索引,并建议使用meta_key
ANDmeta_value
,以更快地运行查询。解释:
如果你使用
AND
,你就把一行的条件“连接”起来了。所以如果你想要多行的AND条件,首先你必须从多行中创建一行,就像这样。测试:表数据:
型
使用
$us_name='Kovge'
$us_yearselect='2012'
$us_reg='GaPa'
,$us_course='PHP'
查询的结果:型
所以应该能用。
watbbzwu3#
选择表结构时,最大的数据灵活性是首选的。这种结构的缺点是效率会受到影响,表通常会因数据而变得非常臃肿,并且查询表通常涉及使用称为“pivot”的技术的聚合函数。
下面是如何使用pivot来执行查询:(db-fiddle demo)
字符串
实际上,整个表被
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的面向对象语法,并实现一个带有绑定参数的预准备语句,以确保安全性/稳定性。型