ugrás a tartalomhoz

MySQL count hiba

abicska · 2010. Már. 25. (Cs), 03.34
Szevasztok Srácok!

Találtam egy hibát és nem értem, hogy mitől lehet. Kérlek, segítsetek rajtam!

Adott 5 tábla, melyek a következő lekérdezéssel vannak összekapcsolva:
SELECT hsps_wall.wall_id, hsps_users.users_vezeteknev, hsps_users.users_keresztnev, hsps_users.users_nick, hsps_wall.wall_text, COUNT(hsps_wall_comments.wall_comments_id) AS wall_comment, COUNT(hsps_wall_like.wall_like_id) AS wall_like, hsps_wall.wall_created
FROM hsps_wall
RIGHT JOIN hsps_relations ON hsps_relations.relations_to = hsps_wall.wall_user
LEFT JOIN hsps_users ON hsps_users.users_id = hsps_wall.wall_user
LEFT JOIN hsps_wall_comments ON hsps_wall_comments.wall_comments_wall = hsps_wall.wall_id
LEFT JOIN hsps_wall_like ON hsps_wall_like.wall_like_wall = hsps_wall.wall_id
WHERE hsps_relations.relations_from = 1 OR hsps_wall.wall_user = 1
GROUP BY hsps_wall.wall_id
ORDER BY hsps_wall.wall_created DESC
LIMIT 30
A probléma az, hogy a két COUNT oszlop hibás értékeket ad random módon. Van, amikor helyes az érték, van amikor duplája annak, aminek kellene lennie.
Akkor változik, ha beszúrok egy-egy sort a kommentek, vagy a like táblába.
Nem értem, hogy miért. Ha valaki tudna segíteni, azt megköszönném!

Ha nagyon nem érthető így, akkor adok DB elérést.

Köszönöm előre is!
Ábel
 
1

Kódtisztítás

tisch.david · 2010. Már. 25. (Cs), 11.21
Szia!

Nincs kedvem fejben matekozni, de ha adsz DB hozzáférést, szívesen megnézem. Ettől függetlenül számomra kicsit konfúznak tűnik az általad használt SQL. Miért használsz RIGHT JOIN-t? Mit szeretnél vele elérni? (Okosítson már ki valaki; nekem eddig még mindig elég volt a JOIN és a LEFT JOIN.)
Mi a célod azzal a GROUP-pal? Ha ID-ra GROUP-olsz, mi lesz a többi, nem kumulált mezőben? Ha azokban minden ID-ra mindig ugyanaz van, akkor szervezd máshogy az SQL szkriptet, vagy használj DISTINCT-et.

Üdv:

Dávid
2

DB hozzáférés

abicska · 2010. Már. 25. (Cs), 13.55
Szia!

Köszönöm a választ! A DB elérése:

phpMyAdmin: http://bit.ly/d40OP1
felhasználó: teszt
jelszó: teszt

Beraktam a szóban forgó táblákat, kevés tartalommal. Kérlek, próbáld ki a lekérdezést, hogy lásd miről van szó.

Köszönöm!
Ábel
3

+1 kérdés

tisch.david · 2010. Már. 25. (Cs), 14.55
Mi a relations tábla és a wall_like tábla szerepe? Le tudnád írni szóban, hogy mit szeretnél a lekérdezéssel kinyerni?

Köszi! Üdv:

Dávid
4

igen

abicska · 2010. Már. 25. (Cs), 15.43
A relations tábla két felhasználó közötti kapcsolat jelölésére szolgál. Magyarul, hogy ismerősök e, ki jelölt be kit.
A wall_like pedig a különböző üzenőfal bejegyzések "lájkolására" ("nekem ez tetszik") szolgál, akárcsak a Facebook-on.

Szeretném lekérni a saját és az isermőseim üzenőfal bejegyzéseit. Ehhez hozzá csatolni a felhasználók adatait, valamint megszámolni, hogy az adott bejegyzéshez hányan szóltak hozzá, illetve hány embernek tetszett.

relations tábla:
ID, ki jelölt be, kit, dátum, állapot (ha 3, akkor ismerősök, más esetben még csak jelölve van)

wall tábla:
ID, users tábla -> ID, szöveg, dátum

comments tábla:
ID, users tábla -> ID, wall tábla -> ID, szöveg, dátum, ip

like tábla:
ID, users tábla -> ID, wall tábla -> ID, dátum, ip

/A COUNT miatt GROUP-olom, mert egyébként nem adja vissza az összes üzenőfal bejegyzést/

Köszönöm a segítséget!
Ábel
5

Nem akarom bonyolítani, de

tisch.david · 2010. Már. 25. (Cs), 16.17
azt írtad, hogy a wall_like az üzenetek megjelölésére szolgál, holott a tábla a users-hez és a wall-hoz van kapcsolva. Nem a wall_comments-hez kéne kötni?
Ugyanígy: azt írod, hogy a saját és felebaráti kommenteket szeretnéd visszakapni, akkor viszont a lekérdezésben nem a wall_comments-ből kéne kiválasztani a comment-et a wall-beli text helyett?

(Nekem - természetesen - a count mindig ugyanannyit ad vissza; most éppen egy egyszerűbb lekérdezést szeretnék összehozni, csak mindig belefutok valamibe. :) )

Köszi a további infókat!

Dávid
6

:)

abicska · 2010. Már. 25. (Cs), 16.29
A wall maga az üzenőfal. Oda kerülnek a felhasználók által írt bejegyzések.
És még ezeket a bejegzéseket lehet kommentelni, illetve bejelölni, hogy tetszik.

Vagyis valahogy így:

TAMÁS: Szép idő van ma. (wall tábla)
-- Ez 2 embernek tetszik. (like tábla)
-- PISTI: Igen, itt is szép idő van.
-- PETI: Remélem, holnap is szép idő lesz. (ez a kettő a comment tábla)


PETI: Jó volt a tegnap este. (wall tábla)
-- Ez 5 embernek tetszik. (like tábla)
-- TOMI: Jól éreztem én is magam. (comment tábla)
7

No, köszi! :)

tisch.david · 2010. Már. 25. (Cs), 16.59
Köszönöm a sok fejtágítást, többet kell(ene) Facebook-olnom, úgy látszik. :) Valóban, nálam is rossz volt a lekérdezésed, de lusta vagyok kinyomozni, hogy miért. Az én - helyesen működő, bár talán nem túl hatékony - lekérdezésem a következő:

SELECT
  w.wall_id,
  w.wall_text,
  w.wall_created,
  u.users_vezeteknev,
  u.users_keresztnev,
  u.users_nick,
  (SELECT COUNT(*) FROM hsps_wall_comments WHERE wall_comments_wall = w.wall_id) comments_count,
  (SELECT COUNT(*) FROM hsps_wall_like WHERE wall_like_wall = w.wall_id) like_count
FROM
  hsps_wall w
    JOIN hsps_users u
        ON u.users_id = w.wall_user AND (u.users_id = 1 OR u.users_id IN
            (SELECT relations_to FROM hsps_relations WHERE relations_from = 1))
ORDER BY
  w.wall_created DESC
LIMIT
  0,30
Mindjárt írok egy csupa JOIN-osat is.

Üdv:

Dávid
8

:)

abicska · 2010. Már. 25. (Cs), 17.19
Ne haragudj már, hagy mutassam ezt meg Neked:

http://www27.zippyshare.com/v/45484791/file.html

http://www27.zippyshare.com/v/69763315/file.html

A lekérdezés ugyanaz. Az eredmény nem. :O
Az első a komplett adatbázis Mac-en, a másik az, amivel te is dolgoztál, Linuxon.
A világ X-edik csodája...
9

Bocs!

tisch.david · 2010. Már. 25. (Cs), 17.33
Nincs nyolcadik csoda, csak beszúrtam még egy relations sort, hogy teszteljem a JOIN-os megoldásomat. :D
Most el kell rohannom, este még - ha érdekel - mintakódot is tudok küldeni, mert a JOIN-os lekérdezés előállítása közben jöttem rá, hogy az "egy GROUP két COUNT" dolog nem igazán kóser. Ugyanis - ha nem tévedek - mindkét COUNT a kétféle találati szám szorzatát fogja adni. Nézd meg COUNT helyett ID-kkal és GROUP nélkül!

Üdv:

Dávid
10

:)

abicska · 2010. Már. 25. (Cs), 18.49
Érdekel, igen és nagyon megköszönöm! :)
Valószínűleg ott lesz a hiba, igazad van.

COUNT helyett IDkkal? Ebben segíts légyszíves!

Ábel
11

Mintakód

tisch.david · 2010. Már. 25. (Cs), 23.48
Szia!

Szóval így fest a "mintakód":

SELECT w.wall_id, w.wall_text, w.wall_created, u.users_vezeteknev, u.users_keresztnev, u.users_nick, c.wall_comments_id, l.wall_like_id
FROM hsps_wall w
  JOIN hsps_users u ON u.users_id = w.wall_user
  LEFT JOIN hsps_relations r ON r.relations_from = 1 AND r.relations_to = w.wall_user
  LEFT JOIN hsps_wall_comments c ON c.wall_comments_wall = w.wall_id
  LEFT JOIN hsps_wall_like l ON l.wall_like_wall = w.wall_id
WHERE w.wall_user = 1 OR r.relations_id IS NOT NULL
ORDER BY w.wall_created DESC
LIMIT 0,30
Ez a GROUP BY és a COUNT beillesztése előtti állapot. Ebből láthatod, hogy ha wall_id-ra GROUP-olsz, akkor a COUNT-ok - feltéve, hogy van mind comment, mind like - egyformák lesznek. Szerintem használd a COUNT helyett a subselect-es formát.

Üdv:

Dávid
12

köszi :)

abicska · 2010. Már. 26. (P), 00.14
Köszönöm szépen! :)
Van még egy érdekes kérdésem. Arra volna esetleg ötleted, hogy hogyan lehetne beletenni ebbe a lekérésbe még azt, hogy én rányomtam e már, hogy tetszik.
Sajnos nem használtam még IF-et SQL lekérésben, de valahogy így képzelem:

IF( (SELECT COUNT(*) FROM wall_like WHERE user = 1 AND wall = 1) > 0 THEN 1, 0) user_liked_this

Vagyis, ha a (számold meg, hogy tetszett e az 1-es bejegyzés) nagyobb, mint nulla, akkor a user_liked_this oszlopba 1 kerül, ha kisebb, akkor 0.

Ezt bele tudjuk még fűzni? :D

Ne haragudj, hogy ennyi idődet elveszem.
Nagyon szépen köszönöm tényleg, hogy segítessz! :)

Ábel
13

És mielőtt válaszolnál, már

abicska · 2010. Már. 26. (P), 00.44
És mielőtt válaszolnál, már meg is oldottam. :)

Nagyon szépen köszönöm a segítségedet! Sokat segítettél!
Köszönöm mégegyszer! :)

Ábel
14

Nincs mit!

tisch.david · 2010. Már. 26. (P), 09.54
Nagyon szívesen!

Üdv:

Dávid