Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Zapytanie - jak lekko zmodyfikować?
Forum PHP.pl > Forum > Przedszkole
robos85
  1. SELECT DISTINCT (
  2. `a`.`question_id`
  3. ), `a`.`id` AS `qa_id` , `a`.`date` , `f`.`id` AS `f_id`
  4. FROM `exp_questions_answers` `a`
  5. LEFT JOIN `exp_questions_answers_flags` `f` ON `f`.`answer_id` = `a`.`id`
  6. WHERE `a`.`user_id` = '1'
  7. ORDER BY `a`.`question_id` DESC , `f_id` DESC


Mam taki wynik:

Chciałbym teraz z tego wyniki=u wybrać distinct(question_id). Jak daje group by to nie zachowuje mi tej kolejności jaka jest na tym wyniku - a jest ona koniecznie taka potrzebna. Jak mogę to przerobić, żeby z takiej postaci w tej kolejności wybierało mi distinct?
phpion
Może do każdego rekordu dopisz numer wiersza (na blogu nospora masz to ładnie opisane), następnie użyj GROUP BY question_id i ORDER BY numer wiersza. Powinno być tak jak chcesz.
robos85
Nie za bardzo rozumiem tamtą rozpiskę z tymi @cośtam:/ Mógłbyś podać jakiś przykład lub coś co mnie jeszcze naprowadzi?
phpion
No chyba masz tam wszystko prosto opisane. @cośtam to zmienne w MySQL. Wykonaj sobie poniższy kod (dla jakieś tabeli):
Kod
mysql> SET @nr = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT *, (@nr := @nr + 1) AS licznik FROM tabela;
+----+--------+---------+
| id | pole   | licznik |
+----+--------+---------+
|  1 | xxx    |       1 |
|  2 | yyy    |       2 |
+----+--------+---------+
2 rows in set (0.00 sec)

Tutaj akurat licznik pokrył się z identyfikatorem, no ale widzisz jak to działa.
robos85
OK, już zrozumiałem o co chodzi z tymi zmiennymi. Tylko co ma mi dać to ten dodatkowy wiersz?

Podłubałem i mam taki efekt, że to zapytanie
  1. SET @i=0;
  2. SELECT (@i := @i +1) AS `counter`, `a`.`question_id` , `a`.`id` AS `qa_id` , `a`.`date` , `f`.`id` AS `f_id` FROM `exp_questions_answers` `a` LEFT JOIN `exp_questions_answers_flags` `f` ON `f`.`answer_id` = `a`.`id` WHERE `a`.`user_id` = '1' ORDER BY `counter` DESC
daje mi takie wyniki:


Chciałbym teraz z tego wybrać question_id unikalnie jak distinct. Do tego qa_id ma byś sortowane jak teraz, czyli malejąco. Dodając group by mam takie zapytanie
  1. SET @i =0;
  2. SELECT (
  3. @i := @i +1
  4. ) AS `counter` , `a`.`question_id` , `a`.`id` AS `qa_id` , `a`.`date` , `f`.`id` AS `f_id`
  5. FROM `exp_questions_answers` `a`
  6. LEFT JOIN `exp_questions_answers_flags` `f` ON `f`.`answer_id` = `a`.`id`
  7. WHERE `a`.`user_id` = '1'
  8. GROUP BY `question_id`
  9. ORDER BY `counter` DESC

Lecz wynik jest taki:

jak widać, kolejność nie była zachowana i w tym przypadku nie powinno być 2ch NULL tylko 1:/

Jak sobie z tym poradzić?



poprawiłem zdjęcie bo coś nie działało
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.