【问题标题】:MySql Statement across different rows跨不同行的 MySql 语句
【发布时间】: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 新手,我不知道如何制作您提到的内容,非常感谢!

标签: php mysql


【解决方案1】:

你可以使用自连接

  SELECT distinct a.user_id 
  FROM table a
  inner join table b on a.user_id = b.user_id and b.field_id = 5 and b.value='idle'
  inner join table c on a.user_id = c.user_id and c.field_id = 4 and c.value = 'loggedin'
  where a.field_id=3 and a.value='BOOK'

【讨论】:

  • scaisEdge,感谢您的评论,但是您的 sql 语句没有考虑登录状态,它必须返回所有登录和状态 = IDLE 并购买书籍的用户,三件事一起 ANDED,但似乎你只检查上面的空闲和书籍,你忘记检查登录,你能再发一个吗?谢谢
  • 非常感谢scaisEdge,我会试试的!!
  • 成功了!!!非常感谢,一百万年后我不会得到它!
猜你喜欢
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多