Цикл обработки каждой строки в запросе - PullRequest
0 голосов
/ 14 февраля 2019

Есть две таблицы:

ТАБЛИЦА 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 у нас может быть одна или несколько книг1 или книг2 и т. Д.

Я хочу знать наименьшую разницу в цене междумои книги (таблица 1), а не мои книги (таблица 2).(Этот заказ важен, не важно, получу ли я отрицательное значение в цене).

Другими словами, я хочу сделать что-то вроде этого:

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

Учитывая, что у нас может быть много цен на книги1 в таблице2, я должен сделать что-то вроде этого

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 строки (для таблицы 2).

Итак, мой вопрос: нужно ли мне использоватьцикл (курсор ??? я могу использовать его здесь?) или есть другой способ сделать это?

Большое спасибо за любой совет!

РЕДАКТИРОВАТЬ

Я пытался

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 голосов
/ 14 февраля 2019

Я думаю, что вам нужен этот запрос, но трудно сказать наверняка без ожидаемых результатов.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               |

см. демо

0 голосов
/ 14 февраля 2019

Попробуйте с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...