2011-11-04 13 views
5

Próbuję uzyskać dane, w których kolejność nie ma znaczenia z unikatowymi identyfikatorami. Więc po prostu moje zapytanie byłobyPHP mysql Wyraźny, tylko ładuj 1 zestaw identyfikatorów

SELECT DISTINCT id1, id2 FROM messages ORDER BY date 

Jeśli mam bazę danych zawierającą następujące dane:

id1 | id2 | date 
5 | 6 | 1/2/2011 
6 | 5 | 1/1/2011 

chciałbym wystarczy załadować kolumnę z najnowszej dacie ponieważ identyfikatory są takie same 2 osoby . Naprawdę muszę załadować identyfikatory gdzie jeden z identyfikatorów jest twoje więc moja prawdziwa zapytanie teraz jest

SELECT DISTINCT userid_1, userid_2 
    FROM messages 
    WHERE userid_2=$dbid 
    OR userid_1=$dbid 
ORDER BY date 

i uzyskać wynik jak [6 5] [5 9] [9 5] [5 15] [5 6] [5 17]

Wyniki 2 i 3 są takie same i 1 i 5 są to samo. Naprawdę tylko 4 wyniki powinny być zapytane. Dzięki!

Odpowiedz

2

Jedną z opcji jest:

SELECT DISTINCT 
if(userid_1 >= userid_2,userid_1, userid_2) AS 'id1', 
if(userid_1 >= userid_2,userid_2, userid_1) AS 'id2' 

FROM messages 
WHERE userid_2=$dbid OR userid_1=$dbid ORDER BY date 
  1. To zapytanie pokazuje dwa pola dla każdego rekordu.
  2. Pierwsze pole będzie userid1 jeśli jest większa lub równa userid2, jeszcze pokaże userid2
  3. Drugie pole ma odwrotny logiki
  4. Daje to pewność, że dwa podobne zestawy wyników będzie alwas zamawiać takie same sposób, więc DISTINCT uzna to za to samo.
+0

Z jakiegoś powodu, jeśli to zrobię, ładuje poprawną ilość wierszy, ale w rzeczywistości nie otrzyma żadnych danych. po prostu pokazuje [] [] [] [], która w tych przypadkach powinna pokazywać mi ładowanie identyfikatorów. if ($ wynik> 0) { \t while ($ wiersz = mysql_fetch_assoc ($ zapytanie)) { \t \t echo "[". $ Wiersz [ 'UserID_1'].””. $ Wiersz [ 'userid_2' ]."]"; \t} } –

+0

nvm, zapomniałem, że musisz umieścić w nawiasie [if (userid_1> = userid_2, userid_1, userid_2)]. –

+0

Działa idealnie, ale jeśli nie masz nic przeciwko, możesz mi wytłumaczyć, jak to działa, ponieważ nie jestem całkiem pewien, że to rozumiem. –

1

Jeśli twoim celem jest, aby uzyskać wyraźne powiązania, można wykonać następujące czynności, aby uzyskać mniejszy pary zawsze w lewej kolumnie, a większe do prawej, zapewniając w ten sposób różne prace:

SELECT DISTINCT 
(id1 - ((id1 - id2) + abs(id1 - id2)) * .5) as first, 
(id2 + ((id1 - id2) + abs(id1 - id2)) * .5) as second 
FROM messages ORDER BY date; 

Ponieważ pary są zawsze ułożone, nie ma potrzeby funkcji parowania.

Przykład

+------+------+--------+------------+ 
| id1 | id2 | val | pair_date | 
+------+------+--------+------------+ 
| 4 | 5 | test 1 | 2010-12-25 | 
| 5 | 4 | test 2 | 2011-10-31 | 
| 17 | 50 | test 3 | 2011-07-04 | 
| 50 | 17 | test 4 | 2001-01-01 | 
+------+------+--------+------------+ 

Jeśli uruchomić tę kwerendę:

SELECT DISTINCT 
    (id1 - ((id1 - id2) + abs(id1 - id2)) * .5) AS first, 
    (id2 + ((id1 - id2) + abs(id1 - id2)) * .5) AS second 
    FROM pairs ORDER BY pair_date; 

uzyskać:

+-------+--------+ 
| first | second | 
+-------+--------+ 
| 4.0 | 5.0 | 
| 17.0 | 50.0 | 
+-------+--------+ 
2 rows in set (0.00 sec) 

Oczywiście stosując logiczną ma taki sam skutek, jest łatwiejszy do odczytania, a prawdopodobnie jest szybszy, ale powyższy algorytm jest przydatny, gdy trzeba zamienić dwie liczby, aby jedna strona była zawsze mniejsza.

Nie jestem pewien, dlaczego dostałeś błąd. Testy uruchamiam bezpośrednio z wiersza poleceń MySQL ...

+0

Dzięki, już mam to, ale umieściłem to, aby zobaczyć, czy to działa również i spowodowało błąd mysql_num_rows. Nie znalazłem tego błędu, ponieważ mam już działający sposób i byłem ciekawy, czy twój też by działał. The Way I zakończyła się robi było „SELECT DISTINCT if (UserID_1> = userid_2, UserID_1, userid_2), jeśli (UserID_1> = userid_2, userid_2, UserID_1) FROM wiadomości GDZIE userid_2 = $ dbid LUB UserID_1 = $ dbid ZAMÓWIENIE Wg daty DESC " –

+0

Zdecydowanie przetestowałem to, ponieważ wiedziałem, że to było trochę dziwne. Istnieje wiele nawiasów, pozostawiając miejsce na zamieszanie .... Ponadto, wartości są zwracane jako podwójne z powodu dzielenia przez 2. Drugą rzeczą jest to, że nie mam pola daty w moim teście. Nie sądzę, żeby to miało znaczenie. Dodam kilka i opublikuję mój test. – Anthony

+0

Dziękuję za wypróbowanie i przekazanie mi opinii. Daj mi znać, czy kiedykolwiek zadziała lub okaże się przydatna. – Anthony