SQLyog
 sql >> база данни >  >> Database Tools >> SQLyog

SQL LIMIT по колона с идентификатор

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

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`

В зависимост от вашата версия на mysql, не можете да имате подзаявка IN, използваща ограничение и изместване (тази версия на MySQL все още не поддържа 'LIMIT &IN/ALL/ANY/SOME subquery'), но това все пак ще работи.

РЕДАКТИРАНЕ:

Ако зададете вътрешната заявка на това:

(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)

Тогава ще връща само услуги с airports_in_flight и потребители (евентуално добавяне на отделна клауза).

РЕДАКТИРАНЕ за изясняване:

В момента имате това като ваш избор:

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`

Искате да ограничите до 2 услуги (не знам дали искате всички услуги, предполагам само тези със съвпадащи потребители и летища в полет), така че трябва да поставите лимита на правилната таблица.

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

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

Ще направя предположение, че има летище в редица за всяка услуга (можем да добавим тази сложност по-късно).

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

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`

Забележете, че замених услугите на таблицата със заявка, която вече мога да огранича, това е подзаявката. Ако сега искаме да разглеждаме само услуги, които имат летище в полет, трябва да променим тази подзаявка от:

select * from services limit 2

до

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

Преименувах таблиците с услуги и airports_in_flight ss и aifs, така че да не се сблъскват с имената в основната заявка, поставих вътрешно присъединяване, за да огранича редовете ми само до таблица за услуги, и ограничено от 2, така че поставям подзаявката в заявката, която сега получаваме:

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`

След това трябва да можете да разширите подзаявката, за да добавите вътрешното присъединяване за потребители (по този начин ограничавате услугите само до тези, които имат редове airports_in_flight и редове с потребители) и да добавите таблицата с потребители към основната заявка.




  1. DBeaver
  2.   
  3. phpMyAdmin
  4.   
  5. Navicat
  6.   
  7. SSMS
  8.   
  9. MySQL Workbench
  10.   
  11. SQLyog
  1. SQL LIMIT по колона с идентификатор

  2. Изберете ВТОРИ ПОСЛЕДЕН запис във всяка група

  3. Как да настроя performance_schema в mysql?

  4. Къде в съответната спецификация е документирано, че някои коментари в SQL скрипт всъщност трябва да се изпълняват като валиден SQL (от MySQL)?

  5. Външен ключ като първичен ключ