Temat: Problem w 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 w zapytaniem mysql

zrób tabelkę temporary
wygeneruj wszystkie interesujące cie kombinacje wysokosc i szerokosc za pomocą jakiegoś SQLa typu insert into select i jakiś kartezjan
znajdź elementy których nie ma w zbiorze wejściowym

i masz wynik jak na tacy

jak jesteś kumaty zrobisz to w procedurze po stronie bazy
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: Problem w zapytaniem mysql

Jest to siatka współrzędnych x oraz y. Znam wielkość siatki i mogę wybrać jej wycinek. Mam listę współrzędnych które używam. Chcę jednak wiedzieć czy dla współrzędnej x mam wszystkie odpowiadające jej współrzędne y z danego zakresu siatki.

SQL załatwi temat w sposób trywialny jeżeli przerwa pomiędzy współrzędnymi punktów y będzie mniejsza 2. Sortujesz po x i po y i dla każdego wiersza sprawdzasz czy istnieje wiersz z wartością y-1. To niestety nie sprawdzi się jeżeli brakuje 2 lub więcej współrzędnych obok siebie (7,3 7,4).

Ja zrobiłbym tak:
1. Tworzę tabelę odzwierciedlającą siatkę (zawiera wszystkie współrzędne).
a) Dodaję do bazy tabelę z sekwencją liczb od 1 do 1000
DROP TABLE IF EXISTS siatka;
CREATE TABLE siatka(
x INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);

INSERT INTO siatka values ();

SET @p= -1;
SET @p=@p+1; INSERT INTO siatka select x+power(2,@p) FROM siatka WHERE (x+power(2,@p)) <= 1000;
SET @p=@p+1; INSERT INTO siatka select x+power(2,@p) FROM siatka WHERE (x+power(2,@p)) <= 1000;
SET @p=@p+1; INSERT INTO siatka select x+power(2,@p) FROM siatka WHERE (x+power(2,@p)) <= 1000;
SET @p=@p+1; INSERT INTO siatka select x+power(2,@p) FROM siatka WHERE (x+power(2,@p)) <= 1000;
SET @p=@p+1; INSERT INTO siatka select x+power(2,@p) FROM siatka WHERE (x+power(2,@p)) <= 1000;
SET @p=@p+1; INSERT INTO siatka select x+power(2,@p) FROM siatka WHERE (x+power(2,@p)) <= 1000;
SET @p=@p+1; INSERT INTO siatka select x+power(2,@p) FROM siatka WHERE (x+power(2,@p)) <= 1000;
SET @p=@p+1; INSERT INTO siatka select x+power(2,@p) FROM siatka WHERE (x+power(2,@p)) <= 1000;
SET @p=@p+1; INSERT INTO siatka select x+power(2,@p) FROM siatka WHERE (x+power(2,@p)) <= 1000;
SET @p=@p+1; INSERT INTO siatka select x+power(2,@p) FROM siatka WHERE (x+power(2,@p)) <= 1000;

b) Na podstawie tabeli tworzę siatkę współrzędnych
SELECT x.x, y.x AS y FROM siatka x 
JOIN siatka y ON 1 = 1
WHERE x.x <= 10 AND y.x <= 10 ORDER BY x.x, y.x
Tu dla przykładu używam siatki o rozmiarze 10x10 puntków.
2. Wyciągam wszystkie punkty z siatki których nie ma na liście w tabeli "tabela"
SELECT * FROM (
SELECT x.x, y.x AS y FROM siatka x
JOIN siatka y ON 1 = 1
WHERE
-- Siatka 10x10
x.x <= 10 AND y.x <= 10 ORDER BY x.x, y.x
) AS s
-- Dodaję znane punkty
LEFT JOIN tabela t ON s.x = t.wysokosc AND s.y = t.szerokosc
WHERE
-- Pokaż punkty z zakresu siatki dla x od 3 do 7 oraz dla y > 1
s.x BETWEEN 3 AND 7 AND y > 1
-- Pokaż te punkty których nie ma na liście znanych punktów
AND t.id IS null;

3. Teraz poprawiam zapytanie tak aby wyciągał najmniejszą brakującą wartość y dla każdego z punktów x
SELECT x, MIN(y) AS y FROM (
SELECT x.x, y.x AS y FROM siatka x
JOIN siatka y ON 1 = 1
WHERE x.x <= 10 AND y.x <= 10 ORDER BY x.x, y.x
) AS s
LEFT JOIN tabela t ON s.x = t.wysokosc AND s.y = t.szerokosc
WHERE s.x BETWEEN 3 AND 7 AND y > 1 AND t.id IS null
GROUP BY x;

Temat: Problem w zapytaniem mysql

Super. Myślałem, że obejdzie się bez tworzenia dodatkowej tabeli i podszedłem do problemu od złej strony. Teraz trochę sobie poprawiłem zapytanie do własnych potrzeb i działa rewelacyjnie.

Dzięki za pomoc.

Następna dyskusja:

[PHP, MYSQL] problem ze stw...




Wyślij zaproszenie do