Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: WHERE z podzapytania dla dwóch kolumn
Forum PHP.pl > Forum > Bazy danych > MySQL
Mion
Witam ponownie,

Do pewnego zapytania od tabeli Tree Kategorii potrzebne są dwie wartości lewa i prawa dla klauzuli WHERE np:
  1. WHERE KT.lft >= 236 AND KT.rgt <= 315

wiec żeby te wartości uzyskać muszę wykonać wstępne zapytanie np:
  1. SELECT K.lft, K.rgt FROM KatTree K WHERE K.id = 15


Ewentualnie jako dwa podzapytania:
  1. WHERE KT.lft >= (SELECT K.lft FROM KatTree K WHERE K.id = 15)
  2. AND KT.rgt <= (SELECT K.rgt FROM KatTree K WHERE K.id = 15)
Co jest kiepskie ze względu na dodatkowe zapytanie.

Czy da się tak ułożyć to zapytanie by było jedno podzapytanie dajace dwie wartosci do wykorzystania z K.lft i K.rgt
coś jak tutaj: http://dev.mysql.com/doc/refman/5.0/en/row-subqueries.html
  1. SELECT * FROM t1
  2. WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
ale z warunkami >= i =<

Pozdarwiam
tvister
Będę improwizował ale wydaje mi się że można posłużyć się klauzulą from .
  1. SELECT * FROM kat,
  2. (SELECT K.lft,K.rgt FROM kat K WHERE K.id = 15) AS rzopa
  3. WHERE KT.lft >= rzopa.lft AND KT.rgt <= rzopa.rgt
Mion
To nie takie proste Panie Kolego .... Niestety nie mogę, bo subquery nie może zwracać danych z dwóch kolumn sad.gif
Operand should contain 1 column(s)
tvister
Cytat
To nie takie proste Panie Kolego .... Niestety nie mogę, bo subquery nie może zwracać danych z dwóch kolumn sad.gif
Operand should contain 1 column(s)


A właśnie że jest proste :-p
manual
Mion
Twoj link nie działa. "A właśnie że jest proste" skoro TAK Twierdzisz Podaj przykładową instrukcję SQL która jest odpowiedzią na mój problem .
tvister
Sorry za link.
http://dev.mysql.com/doc/refman/5.0/en/fro...subqueries.html

Mion
Wiec gdzie na tej stronie jest odpowiedz na moje pytanie - problem nie biorąc pod uwagę procedur składowanych ... bo naprawdę nie widzę lub nie potrafię zobaczyć ?

Możesz podać przykładową komendę SQL która jest odpowiedzią na moje pytanie ?
tvister
Niestety będe znowu tylko teoretyzował ale wg. manuala z poprzedniego posta sql-ka powinna
wyglądać w taki sposoób:

  1. SELECT * FROM kat,
  2. (SELECT K.lft AS paraml,K.rgt AS param2 FROM kat K WHERE K.id = 15) AS rzopa
  3. WHERE KT.lft >= param1 AND KT.rgt <= param2


uupah5
jedna z możliwości:
select concat(x,'#',y) from tableX into @test;

a następnie użyć @test w zasadniczym zapytaniu (potrzebny split po # of cource)

ps musisz mieć powód żeby tak kombinowaćwink.gif
pps musisz mieć powód żeby nie użyć procedury;)
Mion
Cytat(tvister @ 3.11.2011, 22:29:52 ) *
Niestety będe znowu tylko teoretyzował ale wg. manuala z poprzedniego posta sql-ka powinna
Panie Kolego nie wiem czy czytasz tego manuala... ale nadal jest jesteś błędzie z podzapytaniem w którym pobierasz dane SELECT z dwóch kolumn co jest jak już pisałem błędem. Operand should contain 1 column(s) Taką koncepcję to jako pierwszą testowałem i dlatego piszę, że nie jest to takie proste jak się wydaje smile.gif

@uupah5 - nie ma w tym żadnej kombinacji tylko logiczna całość wydawało by się prosta do realizacji jednym zapytaniem.
Czemu nie procedury... dlatego, że na na calej masie hostingów współdzielonych nie możesz stosować procedur składowanych czy też funkcji składowanych
uupah5
Cytat(Mion)
@uupah5 - nie ma w tym żadnej kombinacji tylko logiczna całość wydawało by się prosta do realizacji jednym zapytaniem.
Czemu nie procedury... dlatego, że na na calej masie hostingów współdzielonych nie możesz stosować procedur składowanych czy też funkcji składowanych

chodzi mi o to, że jeśli nie ma relacji między tymi danymi to próba połączenia tego w jedno zapytanie jest jednak jakimś kombinowaniem. jeśli pomocnicze zapytanie nie jest kosztowne, to sens kombinowania maleje.
ale to komentarz z boku, bo to twoja baza, czyli wiesz więcej o tym co potrzebujesz.
Mion
Relacji owszem nie ma, bo pierwsze zapytania służy do pobrania danych określających zakres dla drugiego zapytania które pobiera dane o kategoriach z danego zakresu dla implementacji drzewa kategorii typu "Nested Tree". Sądziłem, że jest jakiś sposób którego ja nie znam, ale ktoś inny tak ... możliwe, że nie da się tego zrealizować tak jak bym chciał czyli w prosty sposób w jednym zapytaniu wink.gif
xdev
Ale się głowicie smile.gif Przecież to prosty JOIN smile.gif Wiem, że może się wydawać, że to tylko do relacji ale przecież one wcale nie są wymagane.

Kod
SELECT KT.*  FROM KatTree K
INNER JOIN xxxx as KT
ON KT.lft >= K.lft AND KT.rgt <= K.rgt
WHERE K.id = 15


Dane 3 userów:
Kod
SELECT * FROM user as a
INNER JOIN user as b
ON b.id=1015
INNER JOIN user as c
ON c.id=1015
WHERE a.id=1015


Subquery lepiej nie stosować - są koszmarnie wolne i nie działają do końca tak jakby się mogło wydawać (najpierw wykonywana jest zewnętrzna kwerenda).
tvister
Cytat
Panie Kolego nie wiem czy czytasz tego manuala... ale nadal jest jesteś błędzie z podzapytaniem w którym pobierasz dane SELECT z dwóch kolumn co jest jak już pisałem błędem. Operand should contain 1 column(s) Taką koncepcję to jako pierwszą testowałem i dlatego piszę, że nie jest to takie proste jak się wydaje


Sprawdziłem zapytanie które podałem poprzednio jest 100% poprawne (ale nie jest optymalne). Proszę przeczytać dokładnie sql-ke.
Niktoś
A może takie rozwiązanie będzie zadowalające:
  1. SELECT Suma FROM (SELECT K.lft, K.rgt FROM KatTree K WHERE K.id = 15) AS TabelaTree UNPIVOT ( Suma FOR TREE IN (K.lft, K.rgt ) ) AS UnpivotTabelaTree;

Kwererenda łączy dwie kolumny K.lft, K.rgt w jedną kolumnę SUMA i wyszukuje w niej K.id = 15
Mion
Niestety to nie tak działa smile.gif wymagany jest warunek:
  1. WHERE KT.lft >= 236 AND KT.rgt <= 315


@Sprawdziłem zapytanie które podałem poprzednio jest 100% poprawne
Dziwne, że system bazobanowy twierdzi inaczej wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.