【问题标题】:Get meta value by using meta key from mysql使用 mysql 中的元键获取元值
【发布时间】:2016-01-11 21:41:49
【问题描述】:

我正在使用 wordpress。我要制作自定义过滤器。我希望在其中使用 metakey 的 memberId。

我的表结构如下表。

参考问题:php - get meta value by using meta key from mysql

我的最后陈述如下:

select distinct(memberid) from membermetas 
where memberMeta = 'kilo' 
and memberMetaValue >= 90 
and memberMeta = 'boy' 
and memberMetaValue <= 175

当我尝试编写此查询时,我什么也没得到。

如何编写查询来获取 memberMeta 字段上的 2 或 3 个条件的 memberId?

【问题讨论】:

  • 尝试使用括号对您的条件进行分组select distinct(memberid) from membermetas where (memberMeta = 'kilo' and memberMetaValue &gt;= 90) and (memberMeta = 'boy' and memberMetaValue &lt;= 175)
  • 您可能会错过表名中的数据库前缀。
  • @MahaDev 我写了前缀。

标签: php mysql wordpress


【解决方案1】:

您正在查询memberMeta 等于kilo AND 等于boy,这显然永远不会是真的。您可能会寻求一个或条件:

select distinct(memberid) from membermetas 
where 
(memberMeta = 'kilo' and memberMetaValue >= 90)
OR
(memberMeta = 'boy' and memberMetaValue <= 175)

但是,如果您希望 memberMetaValue 条件适用于两个 memberMeta 匹配,那么它将是:

select distinct(memberid) from membermetas 
where (memberMeta = 'kilo' OR memberMeta = 'boy')
AND (memberMetaValue >= 90 AND memberMetaValue <= 175)

您甚至可以将其进一步简化为:

select distinct(memberid) from membermetas 
where (memberMeta = 'kilo' OR memberMeta = 'boy')
AND (memberMetaValue BETWEEN 90 AND 175)

【讨论】:

  • 如果我同时拥有不同 memberMeta 的 memberMetaValue 然后写这个查询然后如果我使用 and 则什么也得不到。
  • 这就是我的意思,问题是您使用的是。很抱歉,但我不完全理解你在这句话中的英语。你能详细说明或改写吗?也许创建一个SQLFiddle 来展示您的问题会更好!
  • 我有两个必填字段 memberMeta 作为kilo 和boy,所以我必须使用and 而不是or
  • 我还是不明白你在说什么。同一个字段永远不能同时包含两个精确值。仅在不同的行中,如果要匹配这些行,则必须使用
  • 顺便说一句,您更新了问题 - “如何编写查询以获取 memberMeta 字段上的 2 或 3 个条件的 memberId?” -> 这正是我的回答:使用OR :)
【解决方案2】:
DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,memberid INT NOT NULL
,memberMeta VARCHAR(20) NOT NULL
,memberMetaValue VARCHAR(20) NOT NULL
,UNIQUE(memberid,membermeta)
);

INSERT INTO my_table VALUES
(654, 15,'ulke','Türkiye'),
(653, 15,'eposta','mail@mymail.com'),
(652, 15,'alternatiftel','0000000000'),
(651, 15,'telno','0000000001'),
(650, 15,'kilo','90'),
(649, 15,'boy','175'),
(648, 15,'adsoyad','TestTest'),
(647, 15,'tckimlik','12345678901'),
(655, 15,'yas','23'),
(656, 15,'gozrengi','Elaa');

SELECT memberid 
  FROM my_table
 WHERE (memberMeta = 'kilo' AND memberMetaValue >= 90)
    OR (memberMeta = 'boy' AND memberMetaValue <= 175)
 GROUP 
    BY memberid 
HAVING COUNT(*) = 2;

+----------+
| memberid |
+----------+
|       15 |
+----------+

【讨论】:

    【解决方案3】:

    我在这里写了下面的查询,它工作得很好。我的查询是:

     select membermetas.memberid from membermetas
     INNER JOIN membermetas as table1 ON  membermetas.memberid = table1.memberid AND table1.memberMeta = 'kilo' AND table1.memberMetaValue >= '90'  
     WHERE membermetas.memberMeta = 'boy' AND membermetas.memberMetaValue >= '175'  
    

    【讨论】:

      【解决方案4】:

      好的,你能提供一张你的桌子的截图吗?我问这个是因为您的问题通常不适合 wordpress 通常的表格结构。我的意思是除非您在安装 wp 表时更改它,否则所有表都具有前缀 wp_'tableName'。现在有一个选项可以在安装时更改它,大多数人会忽略它。

      接下来我会问,因为用户表的 wordpress 结构与此有很大不同。 user_id、user_name 等

      最后我要求这样做,因为您提供的参考资料从未说过这是一个 wordpress 表格。

      此外,如果您确定查询是正确的,那么您与数据库的连接如何?你在使用 PDO、MySQL、MySqlite 吗?可能有多种原因无法获得结果。

      最后一个 wordpress 有一个非常安全的结构,它不仅仅是让我们只写一个查询并连接到数据库,如果你在 wordpress 中这样做,你需要先连接到数据库,然后使用内置函数来进行查询,创建新表等。如果您在 wordpress 之外执行此操作,则可以访问数据库,但如果您的脚本编写得不好,您会将整个站点暴露给注入。

      【讨论】:

      • 这应该是评论而不是答案。答案应该是回答问题,cmets 用于请求有关该问题的更多信息。
      • 我使用了类似于给定表链接的 wp_postmeta 表
      • @ArSeN 看起来为了有效地帮助他,需要更多信息。你可能会盲目地走进事情,享受浪费你的时间和其他人一样,或者你可能只是喜欢辩论,我并不在乎。我会评论这个请求,但它不会让我评论。我真的很惊讶,一个自愿通过帮助别人而盲目行走的人竟然获得了 400 以上的排名
      • 我只是指出了 how to answer 的规则在这里有一个问题。无意冒犯。
      猜你喜欢
      • 2014-02-15
      • 2020-06-03
      • 1970-01-01
      • 2023-03-31
      • 2018-10-31
      • 2021-05-10
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      相关资源
      最近更新 更多