Temat: Problem z zapytaniem mysql

Potrzebuje małej pomocy w rozwiązaniu problemu.
Mam tabele z kolumnami wysokosc i szerokosc według których wykonuje różne operacje.
Teraz potrzebuję zapytanie mysql, które znajdzie mi współrzędne pozycji nie znajdującej się w tabeli.

Obrazowo wygląda to tak:
przykładowa tabela:
---------------------------------
| id | wysokosc | szerokosc |
----------------------------------
| 1| 3 | 2 |
| 2| 4 | 2 |
| 3| 4 | 3 |
| 4| 5 | 2 |
| 5| 5 | 3 |
| 6| 5 | 4 |
| 7| 6 | 2 |
| 8| 6 | 3 |
| 9| 6 | 4 |
|10| 6 | 5 |
|11| 7 | 2 |
|12| 7 | 5 |
|13| 7 | 6 |
----------------------------------
Na jej podstawie powstaje mi taka tablica wyników:
3,2 (wysokosc, szerokosc)
4,2 4,3
5,2 5,3 5,4
6,2 6,3 6,4 6,5
7,2 brak brak 7,5 7,6

W takim układzie mam dwie dziury: 7,3 7,4

Teraz potrzebuję takiego zapytania, które pomoże mi znaleźć najniższe możliwe współrzędne, których nie mam w tabeli.
Pominąłem 1,1, bo nie zawsze poszukiwania będę zaczynał od tych współrzędnych.

Doszedłem do takich wyników:
Zapytanie do pobrania całości danych z bazy wygląda tak:
 SELECT * FROM `tabela` WHERE wysokosc>='3' and szerokosc>='2' and szerokosc<=wysokosc+2-3  order by wysokosc ASC

dla współrzędnych startowych 3,2. Pobranie danych i obróbka w php jest bezsensowna, bo pozycji będzie zbyt wiele. Czasem się przyda przy listowaniu i paginacji.

Próbowałem szukać danych po rzędach, ale to też nie rozwiązuje mojego problemu, bo to są kolejne zapytania do bazy. Szczególnie, że nie znam konkretnej wysokości. Oto moje zapytanie:

 
//zmienne startowe
$start_wys=3;
$start_sz=2;

//zapytanie mysql
SELECT id, wysokosc, szerokosc, szerokosc + 1 brakujaca_pozycja_sz
FROM `tabela` t
WHERE NOT EXISTS
(
SELECT *
FROM `tabela`
WHERE wysokosc='7' and szerokosc=t.szerokosc + 1 and szerokosc<=wysokosc+$start_sz-$start_wys

) and wysokosc='7' and szerokosc>='$start_sz' and szerokosc<=wysokosc+$start_sz-$start_wys-1
ORDER BY szerokosc
LIMIT 1


Ten kod wyszukuje mi w 7 wierszu dla pozycji o współrzędnych startowych 3,2

Jak znaleźć te współrzędne przeszukując całą tabelę nie znając wiersza, a mając tylko dane startowe?

Z góry dzięki za pomoc.

konto usunięte

Temat: Problem z zapytaniem mysql

Powiedzialbym, ze podchodzisz do problemu od zlej strony...
Chcesz z bazy rekord, ktorego nie ma - jakos tego nie widze.

Zalozenie:
- Dlugosc i szerokosc to liczby calkowite
- Znasz maksymalna dlugos i szerokosc i nie jest jakas absurdalana - powiedzmy max 1000

Proponuje odwrocic problem:
Tworzysz tablice z brakujacymi wymiarami. W zapytaniu pytasz o pierwszy wiersz, ktorego wys/szer jest wieksza od wymaganej

Temat: Problem z zapytaniem mysql

Nie wnikając czy to jest dobre rozwiązanie, w poniższy sposób, o ile dobrze zrozumiałem opis, można by było znaleźć "dziury" większe niż 1:

SET @start_wys = 3; 
SET @start_sz = 2;

SET @position = 0;
SET @position_offseted = 1;

SELECT t_offseted.h,
t_offseted.w,
t.h,
t.w
FROM (SELECT @position := @position + 1 AS row_no,
t.id,
t.h,
t.w
FROM tabela t
ORDER BY t.h,
t.w) AS t
JOIN (SELECT @position_offseted := @position_offseted + 1 AS row_no,
t.id,
t.h,
t.w
FROM tabela t
ORDER BY t.h,
t.w) AS t_offseted
ON t_offseted.row_no = t.row_no
WHERE ( Abs(t.h - t_offseted.h) * Abs(t.w - t_offseted.w) ) = 0
AND ( Abs(t.h - t_offseted.h) > 1
OR Abs(t.w - t_offseted.w) > 1 )
AND ( t_offseted.h >= @start_wys
AND t_offseted.w >= @start_sz )
ORDER BY t.h,
t.w


Wynik to wiersz ze współrzędnymi początku i końca "dziury". Wygenerowanie współrzędnych pomiędzy tymi dwoma wartościami np. w php dałoby poszukiwane współrzędne.
Zapytanie jest odporne na usunięte wiersze.

Następna dyskusja:

Problem z połączniem z Mysql




Wyślij zaproszenie do