Mysql
 sql >> база данни >  >> RDS >> Mysql

Оператори за оценка на логика на късо съединение

Имайте предвид, че заявката не се изпълнява императивно. Заявката, която сте написали, може да се изпълнява на множество нишки и следователно оператор за късо съединение в клаузата where няма да доведе до само един резултат.

Вместо това използвайте LIMIT клауза за връщане само на първия ред.

SELECT * FROM quantitycache
WHERE bookstore_id = 1 OR city_id = 1 OR country_id = 1
ORDER BY bookstore_id IS NULL ASC,
         city_id IS NULL ASC,
         country_id IS NULL ASC
LIMIT 1;

За да получите най-доброто съвпадение за всички книги в набор от резултати, запазете резултатите във временна таблица, намерете най-добрия резултат и след това върнете интересни полета.

CREATE TEMPORARY TABLE results (id int, book_id int, match_rank int);

INSERT INTO results (id, book_id, match_rank)
SELECT id, book_id, 
    -- this assumes that lower numbers are better
    CASE WHEN Bookstore_ID is not null then 1 
         WHEN City_ID is not null then 2 
         ELSE 3 END as match_rank
FROM quantitycache
WHERE bookstore_id = 1 OR city_id = 1 OR country_id = 1;

Select * 
from (
    select book_id, MIN(match_rank) as best_rank 
    from results 
    group by book_id
) as r
inner join results as rid 
    on r.book_id = rid.book_id 
    and rid.match_rank = r.best_rank
inner join quantitycache as q on q.id = rid.id;

DROP TABLE results;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете имена на таблици с помощта на оператор SELECT в MySQL

  2. Автоматично мащабиране с Amazon Aurora без сървър

  3. Грешка в MySQL/Amazon RDS:нямате СУПЕР привилегии...

  4. SQLAlchemy сесия и връзка

  5. Zend Framework и Mysql - много бавно