循环处理查询中的每一行

时间:2019-02-13 21:42:35

标签: mysql sql loops

有两个表:

表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中,我们只有一本书1,只有一本书2,依此类推。在表2中,我们可以有一本书或多本book1,或者books2,等等。

我想知道我的书(表1)与我的书(表2)之间的最低价差。 (此顺序很重要,我获得的价格是否为负都无关紧要。)

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

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

鉴于我们可以在table2中为book1设置许多价格,所以我必须要做类似的事情

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

2 个答案:

答案 0 :(得分:1)

我认为您需要此查询,但是如果没有预期的结果,很难确定。
如果CASE END为负数,则(my_books.PRICE - not_my_books.PRICE) * -1可使结果始终为books.PRICE - not_my_books.PRICE的正值。
我知道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

答案 1 :(得分:0)

尝试使用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