查询选择匹配条件语句

时间:2017-09-28 20:22:31

标签: mysql wordpress

我正在使用YITH Woocommerce订阅的免费版本,以允许我的Wordpress网站用户能够以订阅的方式购买产品。当用户购买订阅时,会发生一些事情。为订单创建新帖子,为订单创建新订阅,订单和订阅都添加了各种帖子元素。我担心检查用户是否对我的某个产品进行了有效订阅,产品ID为“432”。

以下是数据库中记录的示例:

post_meta表

post_id: 468
meta_key: _product_id
meta_value: 432

post_id: 468
meta_key: _user_id
meta_value: 1

post_id: 468
meta_key: _status
meta_value: active

上面的示例显示ID为“1”的用户具有“有效”订阅,订阅“468”用于产品“432”。

我不确定如何形成一个查询,检查当前登录的用户是否有对产品432的有效订阅,因为数据没有存储在一行中。

编辑:根据James的回答,我能够更新我的查询并获得以下结果。但是,我无法运行成功的where / having子句。当我添加where或having子句时,查询返回空。

NEW QUERY:

SELECT post_id,
GROUP_CONCAT(IF(meta_key='_product_id', meta_value,'') SEPARATOR '') product_id,
GROUP_CONCAT(IF(meta_key='_status', meta_value,'') SEPARATOR '') status,
GROUP_CONCAT(IF(meta_key='_user_id', meta_value,'') SEPARATOR '') user
FROM wprq_postmeta
GROUP BY post_id
ORDER BY post_id DESC

结果:

Array
(
    [0] => Array
        (
           [post_id] => 471
           [product_id] =>
           [status] =>
           [user] =>
        )
    [1] => Array
        (
           [post_id] => 468
           [product_id] => 432
           [status] => active
           [user] => 1
        )
    [2] => Array
        (
           [post_id] => 465
           [product_id] => 432
           [status] => active
           [user] => 2
        )
    [3] => Array
        (
           [post_id] => 499
           [product_id] =>
           [status] =>
           [user] =>
        )
)

在上面的结果集中,我只希望结果为“ status ='有效'且&product_id = 432 AND user = 1

编辑2:我认为我的条款的位置很重要。我最初在group by子句之前有了我的having子句,而且我得到了一个空的结果集。当我按照group by子句移动我的having子句时,它起作用了。

2 个答案:

答案 0 :(得分:1)

这是一种方法,如果您有任何本地问题,请告诉我,

CREATE TABLE post_meta(post_id INT, meta_key CHAR(32), meta_value CHAR(32));

INSERT INTO post_meta VALUES
  (468, '_product_id', 432),
  (468, '_user_id', 1),
  (468, '_status', 'active'),
  (469, '_product_id', 432),
  (469, '_user_id', 1),
  (469, '_status', 'active');

SELECT post_id, GROUP_CONCAT(IF(meta_key='_product_id', meta_value,'') SEPARATOR '') _product_id, GROUP_CONCAT(IF(meta_key='_status', meta_value,'') SEPARATOR '') _status FROM post_meta WHERE post_id = 468 AND meta_key IN ('_product_id', '_status') GROUP BY post_id;

此致

詹姆斯

答案 1 :(得分:0)

在James的帮助下,我能够得到以下查询。我没有意识到我的HAVING子句的位置必须在我的GROUP BY子句之后。

SELECT post_id,
GROUP_CONCAT(IF(meta_key='_product_id', meta_value,'') SEPARATOR '') product_id,
GROUP_CONCAT(IF(meta_key='_status', meta_value,'') SEPARATOR '') status,
GROUP_CONCAT(IF(meta_key='_user_id', meta_value,'') SEPARATOR '') user
FROM wprq_postmeta
GROUP BY post_id
HAVING product_id = 432 AND status = 'active' AND user = $user
ORDER BY post_id DESC