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 № 1Poniż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);
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