Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] Zapytanie z CASE
Forum PHP.pl > Forum > Przedszkole
pawel81
Witam.
Mam nastepujące zapytanie:

  1. $rezult_user = mysql_query("SELECT
  2. CASE
  3. WHEN (U.m_login='".LOGIN."' && U.m_password=md5(password('".PASSWORD."'))) THEN 'acces'
  4. WHEN (N.m_login='".LOGIN."' && N.m_password=md5(password('".PASSWORD."'))) THEN 'new_user'
  5. ELSE 'no_acces'
  6. END AS Acces
  7. FROM user U, new_user N") OR die(mysql_error());


i chcę go rzozszerzć o kolejną instrukcję

  1. CASE Acces
  2. WHEN 'acces' THEN (SELECT Id FROM user WHERE m_login='".LOGIN."')
  3. WHEN 'new_user' THEN (SELECT Id FROM new_user WHERE m_login='".LOGIN."')
  4. ELSE 'NULL'
  5. END AS Id


wynik koncowy:

  1. rezult_user = mysql_query("
  2. SELECT
  3. CASE
  4. WHEN (U.m_login='".LOGIN."' && U.m_password=md5(password('".PASSWORD."'))) THEN 'acces'
  5. WHEN (N.m_login='".LOGIN."' && N.m_password=md5(password('".PASSWORD."'))) THEN 'new_user'
  6. ELSE 'no_acces'
  7. END AS Acces,
  8.  
  9. CASE Acces
  10. WHEN 'acces' THEN (SELECT Id FROM user WHERE m_login='".LOGIN."')
  11. WHEN 'new_user' THEN (SELECT Id FROM new_user WHERE m_login='".LOGIN."')
  12. ELSE 'NULL'
  13. END AS Id
  14.  
  15. FROM user U, new_user N") OR die(mysql_error());


Moje pytanie jest następujące, jak mogę przekazać do drugiej instrukcji CASE wynik działania pierwszego CASE (Acces).
SirZooro
Oj przekombinowałeś trochę smile.gif W tym co napisałeś jest błąd w założeniach - nie ma powiązania między tabelami user i new_user, więc dostaniesz iloczyn kartezjański ich zawartości (rekordy z dwóch tabel połączone każdy z każdym).

W tym przypadku najlepiej jest wykonać dwa niezależne zapytania. Jeżeli jednak z jakiegoś powodu chcesz aby to było jedno zapytanie, połącz je za pomocą union:
  1. SELECT Id FROM user WHERE m_login='".LOGIN."' && m_password=md5(password('".PASSWORD."'))
  2. UNION
  3. SELECT Id FROM new_user WHERE m_login='".LOGIN."' && m_password=md5(password('".PASSWORD."'))
pawel81
Ja tych tabel nie chce łączyć.
Potrzebuję Acces i Id w zależności, który warunek zostanie spełniony.

http://dev.mysql.com/doc/refman/5.0/en/case-statement.html
http://maga.ovh.org/blog/?p=24
SirZooro
Zawsze możesz dodać wartość stałą do listy pól zwracanych przez zapytanie:

  1. SELECT Id, 'access' AS Access FROM user WHERE m_login='".LOGIN."' && m_password=md5(password('".PASSWORD."'))
  2. UNION
  3. SELECT Id, 'new_user' AS Access FROM new_user WHERE m_login='".LOGIN."' && m_password=md5(password('".PASSWORD."'))
pawel81
Poddałeś mi inny pomysł.

  1. $rezult_user = mysql_query("
  2. SELECT
  3. CASE
  4. WHEN (U.m_login='".LOGIN."' && U.m_password=md5(password('".PASSWORD."')))
  5. THEN (SELECT Id FROM user WHERE m_login='".LOGIN."')
  6.  
  7. WHEN (N.m_login='".LOGIN."' && N.m_password=md5(password('".PASSWORD."'))) THEN 'new_user'
  8. ELSE 'no_acces'
  9. END AS Acces
  10. FROM user U, new_user N") OR die(mysql_error());


Jeżeli zostanie zwrócona liczba (Id) ozacz to że jest to użytkownik, new_user jest to osoba, która nie aktywowała konta, no_acces chyba wiadomo.

Jak ktoś zan odpowiedz na moje pytanie to bardzo proszę o odpowiedź.

<a href="http://dev.mysql.com/doc/refman/5.0/en/case-statement.html" target="_blank">http://dev.mysql.com/doc/refman/5.0/en/case-statement.html</a>
<a href="http://maga.ovh.org/blog/?p=24" target="_blank">http://maga.ovh.org/blog/?p=24</a>

Już sobie poradziłem, wystarczyło dodać (SELECT Acces).

  1. rezult_user = mysql_query("
  2. SELECT
  3. CASE
  4. WHEN (U.m_login='".LOGIN."' && U.m_password=md5(password('".PASSWORD."'))) THEN 'acces'
  5. WHEN (N.m_login='".LOGIN."' && N.m_password=md5(password('".PASSWORD."'))) THEN 'new_user'
  6. ELSE 'no_acces'
  7. END AS Acces,
  8.  
  9. CASE (SELECT Acces)
  10. WHEN 'acces' THEN (SELECT Id FROM user WHERE m_login='".LOGIN."')
  11. WHEN 'new_user' THEN (SELECT Id FROM new_user WHERE m_login='".LOGIN."')
  12. ELSE 'NULL'
  13. END AS Id
  14.  
  15. FROM user U, new_user N") OR die(mysql_error());
-m_maga_m-
Mi już co prawda po fakcie, ale przyszło do głowy, żeby tego nie robić podwójnym casem. Strasznie mi się to przez to zamotane wydaje, a chodzi Ci chyba tylko o rozróżnienie userów - może jakaś procedura składowana która rozróżni i zrobi odpowiedniego selecta albo też jakoś krócej w jednym CASE, np:
  1. CASE
  2. WHEN (U.m_login='".LOGIN."' && U.m_password=md5(password('".PASSWORD."'))) THEN (SELECT Id FROM user WHERE m_login='".LOGIN."')
  3. WHEN (N.m_login='".LOGIN."' && N.m_password=md5(password('".PASSWORD."'))) THEN (SELECT Id FROM new_user WHERE m_login='".LOGIN."')
  4. ELSE 'NULL'
  5. END AS Id

Generalnie coś podobnego jak sam sobie napisałeś w ostatnim poście. Jest to krótsze i myslę, że bardziej zrozumiałe. A jak nie to to, jak już wspomniałam jakaś fajna procedurka składowana:)
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.