Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在一个查询中使用多个具有不同条件的SELECT语句_Mysql_Sql_Mysql Python - Fatal编程技术网

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;