【问题标题】:Loop proceeding each row in query循环处理查询中的每一行
【发布时间】:2019-02-13 21:42:34
【问题描述】:

有两个表:

表 1:我的书

BOOK     PRICE
book1    45
book2    21
book3    7
book4    95
book5    32
etc

表 2:不是我的书

OWNER     BOOK     PRICE
owner1    book1    32
owner2    book1    14
owner2    book2    3
owner3    book3    7
owner4    book4    3
etc

所以,在表 1 中我们只有一本书,只有一本书 2,以此类推。在表 2 中,我们可以有一本或多本书籍 1 或书籍 2,等等。

我想知道我的书(表 1)和我的书(表 2)之间的最低价格差异。 (这个顺序很重要,如果我得到负值也没关系)。

换句话说,我想做这样的事情:

price (of books1 from table1) - price (of books1 from table2)

鉴于我们可以在表 2 中有很多书 1 的价格,我必须这样做

price (of book1 from table1) - price1 (of book1 from table2)
price (of book1 from table1) - price2 (of book1 from table2)
….

然后,选择获得的结果之间的最小值。

我当前查询的逻辑是:

SELECT
table1.price - table2.price
FROM
table1
JOIN table2 ON table1.book = table2.book

但它不起作用,因为它返回超过 1 行(对于 table2)。

所以我的问题是:我必须使用循环(光标???我可以在这里使用它吗?)还是有其他方法可以做到这一点?

非常感谢您的建议!

编辑

我试过了

SELECT
min(table1.price - table2.price) AS ‘price difference’
FROM
table1
JOIN table2 ON table1.book = table2.book

它不起作用。

预期结果:

BOOK    PRICE DIFFERENCE
book1    13
book2    18
book3    0
    etc

【问题讨论】:

标签: mysql sql loops


【解决方案1】:

我认为您需要此查询,但如果没有预期结果,很难确定。
如果books.PRICE - not_my_books.PRICE 是负数,则CASE END 可以使(my_books.PRICE - not_my_books.PRICE) * -1 的结果始终为正。
我知道 MySQL 支持 ABS() 做同样的事情,但是这个查询是 ANSI SQL,所以它可以在大多数数据库系统中工作。

查询

SELECT 
   my_books.BOOK
 , MIN(
     CASE 
       WHEN my_books.PRICE - not_my_books.PRICE < 0
       THEN (my_books.PRICE - not_my_books.PRICE) * -1 
       ELSE my_books.PRICE - not_my_books.PRICE 
     END
   ) AS price_difference
FROM 
 my_books
INNER JOIN
 not_my_books
ON
 my_books.BOOK = not_my_books.BOOK
GROUP BY 
  my_books.BOOK

结果

| BOOK  | price_difference |
| ----- | ---------------- |
| book1 | 13               |
| book2 | 18               |
| book3 | 0                |
| book4 | 29               |

demo

【讨论】:

    【解决方案2】:

    尝试使用min 分组运算符

    SELECT my_books.BOOK,
    min(abs(table1.price - table2.price))
    FROM table1
    JOIN table2 ON table1.book = table2.book
    group by my_books.BOOK
    

    【讨论】:

    • 有什么问题?你能详细说明一下吗?
    • 问题?这只会给出一条没有GROUP BY table1.BOOK 子句的记录,这很可能是问题所在..
    • 是的,我的错 :) @user198493 你能再检查一下我的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 2016-12-07
    • 2013-04-25
    • 1970-01-01
    相关资源
    最近更新 更多