SQLyog
 sql >> Baza danych >  >> Database Tools >> SQLyog

SQL LIMIT według kolumny id

Zamiast bezpośrednio czytać tabelę usług, użyj zapytania podrzędnego i dołącz do niego.

select s.*, u.`fname`, u.`lname`, aif.`airport` FROM 
    ( select * from services order by id limit 2) as s INNER JOIN airports_in_flight aif
    ON s.`id` = aif.`service_id` INNER JOIN users u
    ON s.`service_provider_id` = u.`id`

W zależności od wersji mysql, nie możesz mieć podzapytania IN przy użyciu limitu i przesunięcia (ta wersja MySQL nie obsługuje jeszcze podzapytania 'LIMIT &IN/ALL/ANY/SOME'), ale to nadal będzie działać.

EDYCJA:

Jeśli ustawisz zapytanie wewnętrzne na to:

(SELECT s.id
FROM services s
INNER JOIN airports_in_flight aif
    ON s.`id` = aif.`service_id`
INNER JOIN users u
    ON s.`service_provider_id` = u.`id`
LIMIT 2)

Wtedy zwróci tylko usługi z airports_in_flight i użytkownikami (ewentualnie dodać odrębną klauzulę).

EDYTUJ, aby wyjaśnić:

W tej chwili masz to do wyboru:

select s.*, u.`fname`, u.`lname`, aif.`airport` FROM 
        services as s INNER JOIN airports_in_flight aif
        ON s.`id` = aif.`service_id` INNER JOIN users u
        ON s.`service_provider_id` = u.`id`

Chcesz ograniczyć się do 2 usług (nie wiem, czy chcesz wszystkie usługi, zgaduję tylko te z pasującymi użytkownikami i lotniskami w locie), więc musisz ustawić limit na odpowiedniej tabeli.

W tym przypadku właściwą tabelą jest tabela usług. Aby uprościć sprawę, zacznijmy od uproszczonej wersji tego, co masz:

SELECT s.*, aif.`airport` FROM 
        services as s 
INNER JOIN airports_in_flight aif ON s.`id` = aif.`service_id`

Przyjmę założenie, że dla każdej usługi jest lotnisko w rzędzie (możemy dodać tę złożoność później).

Aby wymienić pierwsze 2 usługi, chcemy limitu usług, a nie całego zapytania, więc byłoby to:

SELECT s.*, u.`fname`, u.`lname`, aif.`airport` FROM 
        (select * from services limit 2) as s 
INNER JOIN airports_in_flight aif ON s.`id` = aif.`service_id`

Zauważ, że zastąpiłem usługi tabelowe zapytaniem, które mogę teraz ograniczyć, to jest podzapytanie. Jeśli teraz chcemy spojrzeć tylko na usługi, które mają lotnisko w locie, musimy zmienić to podzapytanie z:

select * from services limit 2

do

select ss.* from services ss 
inner join airports_in_flight aifs on ss.`in` = aifs.`service_id` limit 2

Zmieniłem nazwy tabel services i airports_in_flight ss i aifs, aby nie kolidowały z nazwami w głównym zapytaniu, umieściłem sprzężenie wewnętrzne, aby ograniczyć moje wiersze tylko do tabeli usług i ograniczone do 2, więc umieszczając podzapytanie w zapytanie, które teraz otrzymujemy:

select s.*, u.`fname`, u.`lname`, aif.`airport` 
FROM 
  (select ss.* from services ss 
   inner join airports_in_flight aifs on ss.`in` = aifs.`service_id`
   limit 2) as s 
INNER JOIN airports_in_flight aif ON s.`id` = aif.`service_id`

Powinieneś być w stanie następnie rozwinąć podzapytanie, aby dodać wewnętrzne sprzężenie dla użytkowników (ograniczając w ten sposób usługi tylko do tych, które mają wiersze airports_in_flight i wiersze użytkowników) oraz dodać tabelę users do głównego zapytania.




  1. DBeaver
  2.   
  3. phpMyAdmin
  4.   
  5. Navicat
  6.   
  7. SSMS
  8.   
  9. MySQL Workbench
  10.   
  11. SQLyog
  1. Operacja nie jest dozwolona, ​​gdy innodb_forced_recovery> 0 [SqlYog]

  2. Klucz obcy jako klucz podstawowy

  3. Gdzie w odpowiedniej specyfikacji udokumentowano, że niektóre komentarze w skrypcie SQL są w rzeczywistości wykonywane jako poprawne SQL (przez MySQL)?

  4. Błąd:1449, użytkownik określony jako definiujący ('root'@'localhost') nie istnieje

  5. Importowanie .sql do MS Access za pomocą OBDC