【发布时间】:2017-06-30 13:06:47
【问题描述】:
我正在尝试查询一个 wordpress mySQL 数据库,其中与每个用户有关的值分布在不同的行中(只有天知道他们为什么这样做,为什么不将所有用户信息放在一行上)
例如
ID USER_ID FIELD_ID VALUE
1 1 2 my name is paul smith
2 1 3 books
3 1 4 loggedin
4 1 5 state=busy
5 2 2 my name is big boy
5 2 3 pens
6 2 4 offline
7 2 5 state=idle
在这里您可以看到基于同一用户的 FIELD_ID 的每一行具有不同的含义
FIELD_ID=2 contains the user name
FIELD_ID=3 contains mean what they bought
FIELD_ID=4 means logged in
FIELD_ID=5 is busy or idle
我需要进行一个查询,该查询将返回所有已登录且 STATE=IDLE 并购买了 BOOKS 的用户(或购买了一些其他物品,如钢笔,无论他们想搜索什么)
所以我从这个 php 语句开始
$find="pens";
$q = "SELECT * FROM table
WHERE FIELD_ID='4' AND VALUE='loggedin'
AND FIELD_ID='5' AND VALUE='idle'
AND USER_ID IN
(SELECT USER_ID FROM table WHERE FIELD_ID ='3' AND VALUE LIKE '%$find%')
但我认为这行不通,因为怎么能 FIELD_ID = '4' AND VALUE='loggedin' AND FIELD_ID='5' AND VALUE='idle' 因为它们位于不同的行上。
有人知道如何使用 ONE mySQL 语句来完成吗?
【问题讨论】:
-
“(只有天知道他们为什么要那样做,他们为什么不把所有的用户信息放在一行)”——因为他们不想要一个笨蛋,静态系统,但插件可以根据需要轻松添加其他属性,而无需一直更改数据库结构。这是上帝同意每个明智的开发人员的看法。
-
解决您的问题的方法是按用户 id 分组,通过 WHERE 子句选择所有符合 一个 条件(所以 OR,而不是 AND)的记录,然后然后最后使用 HAVING 过滤掉分组数据上的 COUNT 与您检查的条件数匹配的那些记录。
-
使用 OR 代替 AND 只查找 FEILD_ID 值,VALUE 值不是必需的
-
你好 Lelio 不要认为 OR 会起作用,因为这样就可以检索用户登录但他没有空闲的信息,或者空闲但他没有登录它必须是 AND
-
CBroe,感谢您的评论,您能否为您所谈论的内容编写 MYSQL 语句,我是 SQL 新手,我不知道如何制作您提到的内容,非常感谢!