PHP.EE FOORUM   
Nimi:   Pass:   Mäleta mind! 
   Teemad | php.ee esilehele | registreeri | Märgi kõik teemad loetuks | #php.ee Skype vestlus | RSS
UUS TEEMA  OTSI  Lehekülgi: 1
Keeruline päring
Postitaja: morgoth 2005-01-13 21:36:37
on kaks tabelit:


GRUPP
-------------------
|id|----data------|
-------------------
|1.|.....data.....|
|2.|.....data.....|
|3.|.....data.....|
-------------------

KASUTAJAD
-------------------
|id|----grupp-----|
-------------------
|1.|......1.......|
|2.|......1.......|
|3.|......1.......|
|4.|......2.......|
|5.|......2.......|
-------------------


Nüüd oleks vaja koostada selline präing, mis väljastab grupi, milles on liikmeid alla 3

Ise tegin sellise päringu, kuid see ei väljasta neid gruppe, kus liikmeid on 0 => seega gruppi, mille id=3 ei väljastata:

SELECT DISTINCT a.id, count( b.grupp ) AS kokku
FROM KASUTAJAD AS b
LEFT JOIN GRUPID AS a ON(a.id=b.grupp)
GROUP BY clan
HAVING kokku < 2
ORDER BY kokku ASC

Viimati muudetud: 13-01-2005 21:42:15
Muutja: morgoth
Põhjus:

RE: Keeruline päring
Postitaja: mrq 2005-01-13 22:43:46
Miks mitte teha nii:

$result = mysql_query("SELECT GRUPP.data,count(KASUTAJAD.grupp) FROM GRUPP,KASUTAJAD WHERE GRUPP.id=KASUTAJAD.grupp GROUP BY KASUTAJAD.grupp");

while(list($data,$liikmeid) = mysql_fetch_row($result)){
if($liikmeid<3)
echo $data.'<br />';
}

tagastab grupi nime ja liikmed loendati kokku!
RE: Keeruline päring
Postitaja: morgoth 2005-01-13 23:58:47
Ei, se see oleks ikka vaja ühe päringuga teha, kuna selline süsteem hakkaks serverit koormama (kasutajaid on palju)
RE: Keeruline päring
Postitaja: monte 2005-01-14 10:19:18
mina olen avastanud et serverit hakkavad koormama hoopis keerulised mysql päringud, nimelt tahab mysql joinide puhul ajutisi tabeleid teha ja aegajalt on kaks,kolm lihtpäringut kiiremad kui üks joinm indekseeri oma tabeleid kuidas tahad ...
RE: Keeruline päring
Postitaja: tipatapa 2005-01-14 10:28:00
võib-olla nii:


SELECT
grupid.id, COUNT(kasutajad.id) AS kokku
FROM
kasutajad
LEFT JOIN grupid ON grupid.id = kasutajad.id
GROUP BY grupid.id
HAVING COUNT(kasutajad.id) < 3
ORDER BY kokku ASC
RE: Keeruline päring
Postitaja: andu17 2005-01-16 03:58:09
tipatapa päringu parandus :D. Testisin ja minu oma toimib.

Eelmise päringu viga on selles et left join tehti vales suunas, kui sa tahad kõiki gruppe siis pead Grupi left joinima kasutajatega mitte vastupidi. Ning ORDER BY klauslis ei ole vaj ASC kirjutada kuna see on default.

Ja nüüd siis minu testitud SQL:


CREATE TABLE Grupp(
Grupp_ID MEDIUMINT AUTO_INCREMENT NOT NULL,
nimi VARCHAR(10) NOT NULL,
PRIMARY KEY (Grupp_ID)
);

CREATE TABLE Kasutaja(
Kasutaja_ID MEDIUMINT AUTO_INCREMENT NOT NULL,
Grupp_ID MEDIUMINT NOT NULL,
kasutaja VARCHAR(20),
PRIMARY KEY(Kasutaja_ID)
);

INSERT INTO Grupp (nimi) VALUES ("Grupp 1");
INSERT INTO Grupp (nimi) VALUES ("Grupp 2");
INSERT INTO Grupp (nimi) VALUES ("Grupp 3");
INSERT INTO Grupp (nimi) VALUES ("Grupp 4");
INSERT INTO Grupp (nimi) VALUES ("Grupp 5");

INSERT INTO Kasutaja (Grupp_ID, kasutaja) VALUES (1,"A");
INSERT INTO Kasutaja (Grupp_ID, kasutaja) VALUES (1,"B");
INSERT INTO Kasutaja (Grupp_ID, kasutaja) VALUES (1,"C");

INSERT INTO Kasutaja (Grupp_ID, kasutaja) VALUES (2,"E");
INSERT INTO Kasutaja (Grupp_ID, kasutaja) VALUES (2,"F");
INSERT INTO Kasutaja (Grupp_ID, kasutaja) VALUES (2,"G");
INSERT INTO Kasutaja (Grupp_ID, kasutaja) VALUES (2,"H");

INSERT INTO Kasutaja (Grupp_ID, kasutaja) VALUES (3,"I");

INSERT INTO Kasutaja (Grupp_ID, kasutaja) VALUES (4,"J");
INSERT INTO Kasutaja (Grupp_ID, kasutaja) VALUES (4,"K");
INSERT INTO Kasutaja (Grupp_ID, kasutaja) VALUES (4,"L");
INSERT INTO Kasutaja (Grupp_ID, kasutaja) VALUES (4,"M");
INSERT INTO Kasutaja (Grupp_ID, kasutaja) VALUES (4,"N");

SELECT Grupp.Grupp_ID, COUNT(Kasutaja.Grupp_ID) AS kokku
FROM Grupp LEFT JOIN Kasutaja ON Grupp.Grupp_ID = Kasutaja.Grupp_ID
GROUP BY Kasutaja.Grupp_ID
HAVING COUNT(Kasutaja.Grupp_ID) < 3
ORDER BY kokku;

Leheküljed: 1

©2002-2013 Martin Rebane & PHP.ee kaasautorid
  0.0862250328064