Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] problem z zagnieżdżonym SELECT COUNT
Forum PHP.pl > Forum > Bazy danych
pgrzelka
Witam

mam takie zapytanie
  1. SELECT `p`.*, (SELECT COUNT(*) FROM `social_program_user` `u` WHERE u.social_program_id=p.social_program_id) AS `users` FROM `social_program` AS `p`

wyskakuje błąd Column not found: 1054 Unknown column 'u.social_program_id' in 'where clause''

natomiast jeśli przekształcę zapytanie do takiej postaci ( czyli usunę `u` )
  1. SELECT `p`.*, (SELECT COUNT(*) FROM `social_program_user` WHERE social_program_id=p.social_program_id) AS `users` FROM `social_program` AS `p`

to liczy mi wszystkie rekordy z tabeli 'social_program_user' ponieważ social_program_id=p.social_program_id zawsze zwraca 1
problemem jest to że w obu tabelach są takie same pola pełniące różne funkcje, poniżej dump z tych tabel
  1. CREATE TABLE IF NOT EXISTS `social_program` (
  2. `social_program_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `title` varchar(255) DEFAULT NULL,
  4. `desc` text,
  5. `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  6. `last_modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  7. `admins_id` int(11) DEFAULT NULL,
  8. `date_begin` date NOT NULL DEFAULT '0000-00-00',
  9. `date_end` date NOT NULL DEFAULT '0000-00-00',
  10. `payments_limit` int(255) NOT NULL,
  11. `points_conversion` float NOT NULL,
  12. PRIMARY KEY (`social_program_id`) USING BTREE,
  13. KEY `admins_idx` (`admins_id`) USING BTREE
  14. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

  1. CREATE TABLE IF NOT EXISTS `social_program_user` (
  2. `social_program_user_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  4. `social_program_id` int(11) DEFAULT NULL,
  5. `social_program_group_id` int(11) DEFAULT NULL,
  6. `user_id` int(11) DEFAULT NULL,
  7. `last_modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  8. PRIMARY KEY (`social_program_user_id`) USING BTREE,
  9. KEY `social_group_idx` (`social_program_group_id`) USING BTREE
  10. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;
robsohn
A takie zapytanie nie rozwiąże problemu ?

  1. SELECT p.*, COUNT(u.id) FROM social_program AS p LEFT JOIN social_program_user AS u USING(social_program_id) GROUP BY p.social_program_id
pgrzelka
@robsohn: nie działa Twoje zapytanie

potrzebuję pobrać listę programów z tabeli 'social_program' + ilość użytkowników przypisanych do każdego programu wg.
social_program.social_program_id = social_program_user.social_program_id

problemem jest to że obie tabele mają takie same nazwy kolumn a nie mogę zmienić tych nazw ponieważ bym musiał bardzo dużo zmian robić w innym systemie, który używa tych tabel
quality
Sproboj tak:

  1. SELECT p.*, COUNT(u.social_program_user_id) FROM social_program AS p LEFT JOIN social_program_user AS u ON p.social_program_id=u.social_program_id GROUP BY p.social_program_id


Zapytanie robsohna tez by dzialalo, gdys mial tabele innoDB polaczone relacjami i gdybys troche pomyslal i zmienil u.id na u.social_program_user_id smile.gif

Musi dzialac smile.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.