/ / Czy mógłbyś uprościć to zapytanie? - mysql, sql

Czy możesz uprościć to zapytanie? - mysql, sql

Mam stół o takiej strukturze:

CREATE  TABLE IF NOT EXISTS `mydb`.`sizes` (
`id_size` INT NOT NULL ,
`cm_min` INT NOT NULL ,
`cm_max` INT NOT NULL ,
PRIMARY KEY (`id_size`) )
ENGINE = InnoDB;

To zapytanie zwraca szerokość i wysokość rozmiaru 5:

select cm_min, cm_max from sizes where id_size = 5;

które są:

45, 56

Cóż, chcę uzyskać wszystkie rozmiary, które mają cm_min lub cm_max między tym zakresem. Myślałem coś takiego:

http://sqlfiddle.com/#!2/83e93/51

Działa, ale są rozmiary, które nie mieszczą się w żadnym zakresie. Mam na myśli, jeśli mam to:

id_size    cm_min    cm_max
1          56        59
2          63        67
3          70        74
4          76        79
5          83        86
6          60        62
7          12        14

Jeśli mam wartości id_size 6 i IWykonaj poprzednie zapytanie, zwróci ona 0 wybranych wierszy, a chcę uzyskać id_size rozmiarów większych i mniejszych niż ten, chociaż nie ściśle między wartościami. W tym przypadku zwróci:

id_size    cm_min    cm_max
1          56        59
2          63        67

Lub na przykład, jeśli wartości te id_size 7, które są wartością drugorzędną, potrzebuję uzyskać następną wartość podrzędną, w moim przypadku to:

id_size    cm_min    cm_max
1          56        59

Lub jeśli mam wyższe wartości, potrzebowałbym identyfikatora rozmiaru, który ma drugie wyższe wartości.

Następnie, jeśli pierwsze zapytanie, które opublikowałem, nie daje żadnego wyniku, robię to: http://sqlfiddle.com/#!2/83e93/32/0

To działa. Więc moje pytanie brzmi: Czy mogę zrobić to samo z tylko jednym zapytaniem?

Mam nadzieję, że moje wyjaśnienie było jasne i byłbym wdzięczny za każdą pomoc. Z góry dziękuję.

Odpowiedzi:

1 dla odpowiedzi № 1

Poniższy SQL pomoże Ci rozpocząć, co zwróci wszystkie wiersze, które są wyższe lub niższe od wybranego id, np. tutaj dla id = 6

SELECT id_size
FROM sizes
WHERE (cm_min < 60 or  cm_min > 62) and
(cm_max < 60 or cm_max > 62);

SqlFiddle Demo

Aktualizacja - przykład

Poniżej podałem bliższy przykład Twoich potrzeb: Usunąć LIMIT 1 jeśli potrzebujesz wszystkich rekordów, niżej i wyżej

SELECT id_size , "lower"
FROM sizes
WHERE (cm_min < 12 AND cm_max < 12)
LIMIT 1
UNION
SELECT id_size , "HIGHER"
FROM sizes
WHERE (cm_min > 14 AND cm_max > 14)
LIMIT 1

SqlFiddle Demo