Mysql 在一个查询中使用多个具有不同条件的SELECT语句
我有以下表格: “价格”Mysql 在一个查询中使用多个具有不同条件的SELECT语句,mysql,sql,mysql-python,Mysql,Sql,Mysql Python,我有以下表格: “价格” +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | mediumint(9)
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | mediumint(9) | NO | PRI | NULL | auto_increment |
| product_id | int(11) | YES | | NULL | |
| price | text | YES | | NULL | |
| date | text | YES | | NULL | |
| time | text | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
“产品”
+-----------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+----------------+
| id | mediumint(9) | NO | PRI | NULL | auto_increment |
| category_id | int(11) | YES | | NULL | |
| product_urls | text | YES | | NULL | |
| product_title | text | YES | | NULL | |
| product_image | text | YES | | NULL | |
| product_content | text | YES | | NULL | |
+-----------------+--------------+------+-----+---------+----------------+
这里的连接在Products.id
和Prices.Products\u id
之间
我有一个脚本在运行,它可以抓取URL,从特定网页中获取价格,然后每小时更新“价格”表
我希望通过一个数据库查询显示以下内容:
- 产品名称
- 产品·产品·形象
- prices.price(当前价格,即每个产品id的最后一次插入)
- 今天的平均价格与昨天的平均价格之间的百分比差异
- 当月平均价格与上月平均价格之间的百分比差异
...WHERE category_id=%s...GROUP BY product_id...
我直接编写SQL,特别是使用MySQLdb Python库。第一个子选择的未测试示例(在此模板上进行其他子选择):
可能不是最有效的方法…根据@Cosmin的建议,最后的片段
SELECT p.*,
(SELECT prices.price
FROM prices
WHERE prices.product_id = p.id
ORDER BY prices.id DESC
LIMIT 1) as last_price,
(SELECT ROUND(AVG(prices.price), 2)
FROM prices
WHERE prices.product_id = p.id AND date = CURRENT_DATE()
ORDER BY prices.id DESC
LIMIT 1) as todays_average_price,
(SELECT ROUND(AVG(prices.price), 2)
FROM prices
WHERE prices.product_id = p.id AND date = SUBDATE(CURRENT_DATE, 1)
ORDER BY prices.id DESC
LIMIT 1) as yesterdays_average_price,
(SELECT ROUND(AVG(prices.price), 2)
FROM prices
WHERE prices.product_id=p.id AND MONTH(date)=MONTH(current_date)
ORDER BY prices.id DESC
LIMIT 1) as current_months_average_price,
(SELECT ROUND(AVG(prices.price), 2)
FROM prices
WHERE prices.product_id=p.id AND MONTH(date)=MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
ORDER BY prices.id DESC
LIMIT 1) as previous_months_average_price
FROM products p
WHERE p.category_id=%s;
我不能100%确定如何在查询中计算百分比差异,但我将使用Python来保持查询的干净。如果可以单独进行这些操作,则可以在一个查询中使用价格的子选择,通过匹配内部价格来实现。product\u id(来自子选择)对于outer products.id,是时候学习数据类型了。DATETIME表示DATETIME,DECIMAL表示price,VARCHAR和INT(可能)表示一切else@Cosmin你能举一些例子吗?@草莓有什么好处,内存分配?主要是关于优化。除了你的答案,再次感谢!)你能解释一下起始的p吗?我不明白它是怎么工作的?@Adders它的意思是“表p中的所有列”,这是一个坏习惯,在大多数情况下你应该避免。如果这些是您想要的列,请显式列出
p.product\u title、p.product\u image、p.price
。@Air是的,这是一个糟糕的习惯,而且由于查询仍然不完整,因此我没有写入所需的单元格,而只是编写了*,很抱歉造成混淆
SELECT p.*,
(SELECT prices.price
FROM prices
WHERE prices.product_id = p.id
ORDER BY prices.id DESC
LIMIT 1) as last_price,
(SELECT ROUND(AVG(prices.price), 2)
FROM prices
WHERE prices.product_id = p.id AND date = CURRENT_DATE()
ORDER BY prices.id DESC
LIMIT 1) as todays_average_price,
(SELECT ROUND(AVG(prices.price), 2)
FROM prices
WHERE prices.product_id = p.id AND date = SUBDATE(CURRENT_DATE, 1)
ORDER BY prices.id DESC
LIMIT 1) as yesterdays_average_price,
(SELECT ROUND(AVG(prices.price), 2)
FROM prices
WHERE prices.product_id=p.id AND MONTH(date)=MONTH(current_date)
ORDER BY prices.id DESC
LIMIT 1) as current_months_average_price,
(SELECT ROUND(AVG(prices.price), 2)
FROM prices
WHERE prices.product_id=p.id AND MONTH(date)=MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
ORDER BY prices.id DESC
LIMIT 1) as previous_months_average_price
FROM products p
WHERE p.category_id=%s;