我编写了一个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')"
);
答案 0 :(得分:46)
我会使用此查询:
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
。
答案 1 :(得分:25)
如果以后您希望显示的内容超过user_id
,则可以使用联接,并且在一行中可以显示您需要的所有数据。
如果您想使用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
和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 |
+---------+
所以它应该有效。
答案 2 :(得分:3)
你也可以使用" AND"而不是" OR"如果你想要应用这两个属性。
select * from tickets where (assigned_to='1') and (status='open') order by created_at desc;
答案 3 :(得分:0)
让我们假设有一个表,该表带有以下针对表(hello)的describe命令- 名称char(100), id整数, 计算整数 城市char(100)。
我们有以下针对MySQL的基本命令-
select * from hello;
select name, city from hello;
etc
select name from hello where id = 8;
select id from hello where name = 'GAURAV';
现在让我们查看多个条件-
select name from hello where id = 3 or id = 4 or id = 8 or id = 22;
select name from hello where id =3 and count = 3 city = 'Delhi';
这是我们可以在MySQL中使用多个where命令的方式。
答案 4 :(得分:0)
您正在查询一个表,该表被设计为我所看到的“统一内容模型”(UCM)。当首选最大数据灵活性时选择此表结构。这种结构的缺点是效率会受到影响,表通常会因数据过于臃肿而受到影响,并且查询表通常涉及使用称为“枢轴”的技术的聚合函数。
以下是如何使用数据透视来执行查询:(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()
)查询。< /p>
HAVING 子句是过滤逻辑必须在 GROUP BY 之后的地方(WHERE 过滤发生在 GROUP BY 之前)。在“数据集群”中,您可以通过检查其 meta_key
来隔离数据。当您找到与 meta_key
匹配的行时,您使用它的 meta_value
,如果不是,则分配一个有区别的默认值。 IF
处理了聚合中的所有行后,您就知道要查找的行是非 NULL 值——这是通过调用 MAX()
访问的。使用此最大值与您要过滤的实际 值进行比较。根据需要尽可能重复此过滤器以满足您的业务逻辑。
我还应该声明,您没有使用安全编码实践。 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;
答案 5 :(得分:-2)
你有互相排斥的条件 - 如果meta_key是'first_name',它也不能是'yearofpassing'。很可能你需要你的AND是OR的:
$result = mysql_query("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')")