【问题标题】:mysql issue: how can I select and cast in a where statement?mysql 问题:如何在 where 语句中选择和转换?
【发布时间】:2021-06-16 08:06:13
【问题描述】:

我有这个数据库表:

post_id | key    | value
297     | title  | test
297     | price  | 50
250     | title  | test2
250     | price  | 75
100     | title  | test3
100     | price  | 100

问题是:我如何才能获得所有(分组)post_ids,其中包含价格位置按标题排序

这不起作用:

SELECT post_id
     , price*1 AS number 
  FROM table 
 WHERE number <= 75 
 ORDER 
    BY key 
 GROUP 
    BY post_id; 

【问题讨论】:

  • 每个post_id可以有多个title吗?
  • 你的表结构好像有点不正常
  • @Martin 对我来说似乎是一个非常标准的 eav
  • @Strawberry 同一个键有多个值?不确定我是否同意这是相当标准的
  • @Martin 错过了! (希望是笔误)

标签: mysql sql wordpress select


【解决方案1】:

假设每个帖子严格有一个价格和标题:

SELECT post_id, t1.value price, t2.value title
FROM table t1 
JOIN table t2 USING (post_id)
WHERE t1.key = 'title'
  AND t2.key = 'price'
-- another WHERE conditions if needed
ORDER BY t2.value

【讨论】:

  • 每个帖子没有一个价格 - OP 的示例数据至少有两个价格 post_id297
  • @Martin 这看起来像是一个错字,而不是事实。
  • 谢谢,唯一不正确的是价格在哪里。如何将其转换为整数?
  • 更新:当我在你的 where 评论中添加这个“AND t2.value + 0
【解决方案2】:
DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(entity_id INT NOT NULL
,attribute VARCHAR(12) NOT NULL
,value VARCHAR(12) NOT NULL
,PRIMARY KEY(entity_id,attribute)
);

INSERT INTO my_table VALUES
(297,'title','test'),
(297,'price','50'),
(250,'title','test2'),
(250,'price','75'),
(100,'title','test3'),
(100,'price','100');

CREATE VIEW v_my_table AS
SELECT a.entity_id
     , a.value title
     , b.value price
  FROM my_table a
  LEFT
  JOIN my_table b
    ON b.entity_id = a.entity_id
   AND b.attribute = 'price'
 WHERE a.attribute = 'title';
 
SELECT * FROM v_my_table WHERE price+0 < 75;
+-----------+-------+-------+
| entity_id | title | price |
+-----------+-------+-------+
|       297 | test  | 50    |
+-----------+-------+-------+

UPDATE v_my_table SET price = 100 WHERE price+0 < 75;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

SELECT * FROM v_my_table WHERE price+0 < 75;
Empty set (0.01 sec)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2016-05-07
    • 2020-04-03
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    相关资源
    最近更新 更多