Witam. Mam takie tabele:
To jest tabela ze zdjęciami (użytkownik może mieć kilka zdjęć)
  1. CREATE TABLE `module_Dates_photos` (
  2. photo_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3. student_id INT(10) UNSIGNED NOT NULL,
  4. photo_name VARCHAR(255) NOT NULL,
  5. photo_desc VARCHAR(50) NOT NULL,
  6. thumb_name VARCHAR(255) NOT NULL,
  7. add_date INT(11) NOT NULL)

Tabela z avatarami (jeden użytkownik ma tylko jeden avatar):
  1. CREATE TABLE `module_Dates_avatars` (
  2. avatar_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3. student_id INT(10) UNSIGNED NOT NULL,
  4. avatar_name VARCHAR(255) NOT NULL,
  5. add_date INT(11) NOT NULL)

Tabela łącząca użytkowników w przyjaciół:
  1. CREATE TABLE `module_Dates_friends` (
  2. friend_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3. sender_id INT(10) UNSIGNED NOT NULL,
  4. recipient_id INT(10) NOT NULL,
  5. accepted TINYINT(1) UNSIGNED NOT NULL,
  6. send_date INT(11) NOT NULL
  7. )

Tabela zawierająca dane użytkowników(loginy itp):
  1. CREATE TABLE IF NOT EXISTS `module_Uniwerki_students` (
  2. student_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3. login VARCHAR(20) NOT NULL,
  4. password VARCHAR(32) NOT NULL,
  5. email VARCHAR(70) NOT NULL,
  6. hash VARCHAR(32) NOT NULL,
  7. show_mail TINYINT(1) UNSIGNED DEFAULT 0,
  8. sex VARCHAR(6) NOT NULL,
  9. name VARCHAR(50) DEFAULT NULL,
  10. surname VARCHAR(70) DEFAULT NULL,
  11. city VARCHAR(50) DEFAULT NULL,
  12. birthdate INT(11) DEFAULT NULL,
  13. telephone VARCHAR(11) DEFAULT NULL,
  14. show_telephone INT(1) DEFAULT 0,
  15. gg INTEGER(8) UNSIGNED DEFAULT NULL,
  16. university TINYINT(2) UNSIGNED DEFAULT NULL,
  17. major VARCHAR(255) DEFAULT NULL,
  18. year_of_study TINYINT(1) DEFAULT NULL,
  19. lastlogin INT(11) DEFAULT NULL,
  20. lastlogin_ip VARCHAR(16) DEFAULT NULL,
  21. create_time INT(11) NOT NULL)

Teraz mam 3 znajomych w tabeli friends:
  1. INSERT INTO `module_Dates_friends` VALUES(1, 13, 12, 1, 1211266054);
  2. INSERT INTO `module_Dates_friends` VALUES(2, 14, 12, 1, 1211268337);
  3. INSERT INTO `module_Dates_friends` VALUES(3, 10, 11, 0, 1211277727);

teraz chcę pobrać (dla studenta z id 12) informacje z tych tabel;
1. wszystkie kolumny z module_Dates_friends
2. avatar_name z tabeli module_Dates_avatars
3. miniatura pierwszego dodanego przez studenta zdjęcie (thumb_name) z tabeli module_Dates_photos
4. login studenta który należy do przyjaciół z tabeli module_Uniwerki_students
5. ilość znajomych studenta który należy do znajomych
Wynikiem oczywiście jest kilka rekordów jeśli jest kilku znajomych. Ze wszystkim sobie poradziłem poza ilością znajomych studenta który należy do znajomych. Tzn pobieram liste znajomych i chce żeby przy każdym z nich wyświetlała się ich liczba znajomych. Robie to zapytaniem (przykładowy student o id 12 ma 2 znajomych którzy mają tylko po jednym znajomym [studenta o id 12]):
  1. SELECT friends.*, students.login, photos.thumb_name, avatars.avatar_name, COUNT(friends2.friend_id) AS friends_num
  2. FROM module_Dates_friends AS friends LEFT JOIN module_Uniwerki_students AS students ON ( students.student_id = friends.sender_id AND friends.sender_id != 12) OR (students.student_id = friends.recipient_id AND friends.recipient_id != 12)
  3. LEFT JOIN module_Dates_photos AS photos ON ( photos.student_id = friends.sender_id AND friends.sender_id != 12) OR (photos.student_id = friends.recipient_id AND friends.recipient_id != 12)
  4. LEFT JOIN module_Dates_avatars AS avatars ON ( avatars.student_id = friends.sender_id AND friends.sender_id != 12) OR (avatars.student_id = friends.recipient_id AND friends.recipient_id != 12)
  5. LEFT JOIN module_Dates_friends AS friends2 ON (friends2.recipient_id = friends.recipient_id AND friends2.sender_id = friends.sender_id OR friends2.recipient_id = friends.sender_id AND friends2.sender_id = friends.recipient_id) AND friends2.accepted=1
  6. WHERE friends.recipient_id = 12 OR friends.sender_id = 12
  7. GROUP BY friends.friend_id
  8. ORDER BY friends.send_date ASC, photos.photo_id ASC

Wynik otrzymuje taki:
Kod
friend_id     sender_id     recipient_id     accepted     send_date     login     thumb_name     avatar_name     friends_num
1    13    12    1    1211266054    student4    47f5bd2530942a8c03d020d4339c42e3_thumb.jpg    59d00d6828efcd793b0b37efdb004e22.jpg    3
2    14    12    1    1211268337    student5    026cad586a1dd38383dd677f586a9152_thumb.jpg    426df4f8cdb98c196bcc5208210d9dfa.jpg    2

Wszystkie dane są ok poza ostatnią kolumną czyli liczbą znajomych studenta. Ona jest równa temu ile jest zdjęć w tabeli module_Dates_photos danego studenta a nie ilości znajomych tego studenta :/ nie wiem za bardzo jak sobie z tym poradzić nie wkładając w zapytanie podzapytania bo o ile dobrze się orientuję to podzapytania dość mocno spowalniają... jakieś pomysły?


Ok poradziłem sobie podzapytaniem:
  1. SELECT friends.*, students.login, photos.thumb_name, avatars.avatar_name,
  2. (SELECT COUNT(f.friend_id) FROM module_Dates_friends AS f WHERE (f.recipient_id = friends.recipient_id AND f.sender_id = friends.sender_id OR f.recipient_id = friends.sender_id AND f.sender_id = friends.recipient_id) AND f.accepted=1) AS friends_num
  3. FROM module_Dates_friends AS friends
  4. LEFT JOIN module_Uniwerki_students AS students ON ( students.student_id = friends.sender_id AND friends.sender_id != 12) OR (students.student_id = friends.recipient_id AND friends.recipient_id != 12)
  5. LEFT JOIN module_Dates_photos AS photos ON ( photos.student_id = friends.sender_id AND friends.sender_id != 12) OR (photos.student_id = friends.recipient_id AND friends.recipient_id != 12)
  6. LEFT JOIN module_Dates_avatars AS avatars ON ( avatars.student_id = friends.sender_id AND friends.sender_id != 12) OR (avatars.student_id = friends.recipient_id AND friends.recipient_id != 12)
  7. WHERE friends.recipient_id = 12 OR friends.sender_id = 12
  8. GROUP BY friends.friend_id
  9. ORDER BY friends.send_date ASC, photos.photo_id ASC