【问题标题】:Multiple SELECT statements with different conditions in one query一个查询中具有不同条件的多个 SELECT 语句
【发布时间】:2015-07-27 02:12:03
【问题描述】:

我有以下表格:

“价格”

+------------+--------------+------+-----+---------+----------------+
| 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.idPrices.products_id之间。

我有一个脚本正在运行,它抓取 URL,从特定网页中抓取价格,然后每小时更新一次“价格”表。

我想显示以下内容,最好使用一个数据库查询:

  • products.product_title
  • products.product_image
  • prices.price(当前价格,即每个产品 ID 的最后插入)
  • 今天的平均价格和昨天的平均价格之间的百分比差异
  • 当月均价与上月均价的百分比差异

我可以分开做这些事情,但我不能把它们放在一个查询中。

为了清楚起见,我想一次获取特定类别中的所有产品 - 考虑到这一点,我一直在这样做:

...WHERE category_id=%s...GROUP BY product_id...

我正在直接编写我的 SQL,特别是使用 MySQLdb Python 库。

【问题讨论】:

  • 是时候了解数据类型了。使用 DATETIME 表示日期时间,使用 DECIMAL 表示价格,(可能)使用 VARCHAR 和 INT 表示其他所有内容
  • @Cosmin 你能举一些例子吗?
  • @strawberry 有什么好处,内存分配?
  • 主要是优化。

标签: mysql sql mysql-python


【解决方案1】:

根据@Cosmin 的建议进行最终的 sn-p...

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 来做这件事以保持查询干净。

【讨论】:

    【解决方案2】:

    第一个子选择的未测试示例(在此模板上制作其他子选择):

    SELECT p.*,
         (SELECT prices.price
              FROM prices
              WHERE prices.product_id = p.id
              ORDER BY prices.id DESC
              LIMIT 1) as last_price
    FROM product p
    WHERE p.category_id = 4;
    

    可能不是最有效的强硬方式......

    【讨论】:

    • 除了您的回答,再次感谢! :) 你能解释一下起始页吗?*我不明白它是如何工作的?
    • @Adders 它的意思是“表 p 中的所有列”,这是一个坏习惯,在大多数情况下应该避免。如果这些是您想要的列,请明确列出 p.product_title, p.product_image, p.price
    • @Air 是的,这是一个坏习惯,而且由于查询不完整,我没有写所需的单元格,而是写了 *,抱歉造成混淆
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多