Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Subselect jako prametr
Forum PHP.pl > Forum > Przedszkole
indexx
Witam

Mamproblem z dośc dużym jak na moje możliwości zapytaniem MySQL, wygląda ono w ten sposób:

  1. SELECT
  2. *,
  3. (
  4. SELECT COUNT(*) FROM `user_files` WHERE `file_status` = 'aproved' AND `id` IN(
  5. SELECT files_id FROM `file_tags` WHERE `file_tag` IN(1,2,3,4,5,6)
  6. )
  7. ) AS COUNTED_DATA
  8. FROM `user_files` WHERE `file_status` = 'aproved' AND `id` IN(
  9. SELECT files_id FROM `file_tags` WHERE `file_tag` IN(1,2,3,4,5,6)
  10. ) ORDER BY added DESC LIMIT 0,10


jak widać dwa razy wykonane jest zapytanie:
  1. SELECT files_id FROM `file_tags` WHERE `file_tag` IN(1,2,3,4,5,6)


czy jest możliwość aby przypisać je do parametru i wrzucić do IN()? Tak chciałbym aby towyglądało:

  1. SELECT
  2. *, ( SELECT files_id FROM `file_tags` WHERE `file_tag` IN(1,2,3,4,5,6) ) AS raz_wykonane,
  3. (
  4. SELECT COUNT(*) FROM `user_files` WHERE `file_status` = 'aproved' AND `id` IN(
  5. raz_wykonane
  6. )
  7. ) AS COUNTED_DATA
  8. FROM `user_files` WHERE `file_status` = 'aproved' AND `id` IN(
  9. raz_wykonane
  10. ) ORDER BY added DESC LIMIT 0,10


Pozdrawiam i z góry dziękuję za pomoc.
mar1aczi
Jeśli masz to połączone z PHP to możesz wykonać tego selecta wcześniej, zrobić z jego wyniku listę przecinkową i podstawić ją do ostatecznego select'a.
mortus
Dobrze by było, gdybyś przedstawił strukturę tabel, opisał za co dana tabela odpowiada, a może nawet wkleił jakieś przykładowe dane. No i napisz, co chcesz osiągnąć. Powinno nam być łatwiej zrozumieć problem, bo to podzapytanie z COUNT-em działa niezależnie od reszty i nie byłbym taki pewien, czy wyciąga dokładnie to, o co Ci chodzi.
indexx
Struktura uproszczona
#user_files
id | title | img | content | file_status | added
#file_tags
id | files_id | file_tag

Zapytanie pobiera dane z tabeli user_files na podstawie listy file_tag czyli Id konkretnych tagów w bazie, wynikiem są rekordy tabeli user_files posiadające tagi podobne do listy IN() .

Pierwsze zapytanie, które podałem pobiera dane poprawnie po 10 rekordów, jednocześnie dodając kolumnę z liczbą wszystkich rekordów spełniających warunek.

Zależy mi aby zapytanie
  1. SELECT files_id FROM `file_tags` WHERE `file_tag` IN(1,2,3,4,5,6)

wykonać tylko raz, a nie dwa razy jak jest to teraz.

Mógł bym odseparować na dwa zapytania w PHP jednak zależy mi aby działo się to jednym zapytaniu MySQL
viking
Możesz spróbować wykorzystać http://dev.mysql.com/doc/refman/5.6/en/sql...statements.html
indexx
Niestety zwraca tylko jeden rekord:

  1. PREPARE stmt1 FROM 'SELECT
  2. *,
  3. (
  4. SELECT COUNT(*) FROM user_files WHERE file_status = \'aproved\' AND `id` IN(
  5. ?
  6. )
  7. ) AS COUNTED_DATA
  8. FROM user_files WHERE file_status = \'aproved\' AND `id` IN(
  9. ?
  10. ) ORDER BY added DESC LIMIT 0,10';
  11. SET @a = (SELECT GROUP_CONCAT(files_id SEPARATOR ',') FROM file_tags WHERE file_tag IN(1,2,3,4,5,6));
  12. EXECUTE stmt1 USING @a, @a;
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.