有两个表:
表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
答案 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