![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 437 Pomógł: 42 Dołączył: 16.04.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam! Mam pewien skrypt:
Który porównuje mi moich i innej osoby znajomych. Oto wyniki: Kod moi znajomi: Array ( [0] => 1996 [1] => 1 [2] => 24306 [3] => 12639 [4] => 5057 [5] => 1757 ) znajomi kogoś: Array ( [0] => 2 [1] => 1757 ) wspólni znajomi: Array ( [5] => 1757 ) Dodatkowo zamieszczam zrzut tabeli friends:
proszę o ocenę i poprawki ![]() Ten post edytował sebekzosw 25.07.2010, 17:56:08 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Ocena? Pała, siadaj.
Takie rzeczy możesz robić (i powinieneś!) na poziomie samej bazy danych. Co jeśli chciałbym do tego dołożyć np. imiona i nazwiska wspólnych znajomych? Możesz walnąć kolejne zapytanie (czyli mamy już 3). Możesz też w pierwszym lub drugim zapytaniu dołączyć dane użytkowników (ale przy np. 1000 znajomych pierwszego użytkownika i 0 wspólnych pobierasz zbędnie 1000 rekordów i zapisujesz je do tablicy). Niestety MySQL nie wspiera INTERSECT. Jednak w Google znajdziesz rozwiązania okrężne. Podaję pierwsze z brzegu: Cytat Doing an INTERSECT An INTERSECT is simply an inner join where we compare the tuples of one table with those of the other, and select those that appear in both while weeding out duplicates. So
can simply be rewritten to
Źródło: http://www.bitbybit.dk/carsten/blog/?p=71 PS: Twój index też jest z dupy. Po pierwsze: id masz kluczem głównym więc po co pakować go w dodatkowy index (szczególnie na pierwszy miejscu). Po drugie: sprawdzałeś czy taka kombinacja (wszystkich pól!) sprawi, że index zostanie użyty? Nie sprawdzałeś, bo nie zostanie użyty. Poza tym: po co Ci kolumna id? Postaw klucz główny na dwóch kolumnach (user1 i user2). Patrząc dalej na strukturę tabeli: pole status powinno być typu ENUM z określoną listą wartości, polu data lepiej nadać typ DATETIME lub TIMESTAMP ("od tego są one, od tego one są, od tego są, od tego są one"). Ten post edytował phpion 26.07.2010, 08:02:45 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 437 Pomógł: 42 Dołączył: 16.04.2007 Ostrzeżenie: (0%) ![]() ![]() |
nie mam pojęcia jak to zapytanie całe połączyć, może jakaś pomoc?
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 9 Pomógł: 0 Dołączył: 3.05.2010 Skąd: Częstochowa Ostrzeżenie: (0%) ![]() ![]() |
http://funkcje.net/nsc/4/2867/0/38/page.html
Kwerendy są bardzo przydatne, radzę się ich nauczyć ![]() Ten post edytował Czyluk 27.07.2010, 10:58:50 -------------------- [ CzyzDesign ]
[ MacBook Pro 13" 2.4GHz 4GB 250GB ] [ Magic Mouse ] |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 437 Pomógł: 42 Dołączył: 16.04.2007 Ostrzeżenie: (0%) ![]() ![]() |
nie potrafię tego wymyślić...
znalazłem takie coś: http://forums.digitalpoint.com/showthread.php?t=590030 ale nie działają te zapytania ... ;/ zna ktoś rozwiązanie? Kod SET @user = 2; @znajomy = 921; SELECT IF(`f1`.`user1` = @user, `f1`.`user2`, `f1`.`user1`) AS `user_id` FROM `friends` AS `f1` WHERE (`f1`.`user1` = @user OR `f1`.`user2` = @user) AND `f1`.`status` = 1 AND IF(`f1`.`user1` = @user, `f1`.`user2`, `f1`.`user1`) IN ( SELECT IF(`f2`.`user1` = @user, `f2`.`user2`, `f2`.`user1`) FROM `friends` AS `f2` WHERE (`f2`.`user1` = @znajomy OR `f2`.`user2` = @znajomy) AND `f2`.`status` = 1 ) HAVING `user_id` != @znajomy; co myślicie o tym zapytaniu? |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 18:37 |