Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Programovacie jazyky, rady, poradňa...
Shakal
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 31 jan 2006, 18:54

Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa Shakal »

Prosím vás, nájde sa tu nejaký šikovný človek, čo mi pomôže sformulovať taký špečiálny MYSQL dotaz?
Možno to nie je možné, neviem ale skúšam všetko možné a nič mi poriadne nefunguje.
Veľmi by mi to pomohlo, nemusel by som prepisovať väčšiu časť kódu a robiť dva separátne dotazy...

Mám dve tabuľky.

Kód: Vybrať všetko

mysql> describe Ankety;
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| ID          | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| Anketa      | varchar(250)        | NO   |     | NULL    |                |
| Platnost_DO | datetime            | NO   |     | NULL    |                |
| Status      | tinyint(3) unsigned | NO   |     | NULL    |                |
+-------------+---------------------+------+-----+---------+----------------+
a

Kód: Vybrať všetko

mysql> describe Vyplnene;
+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| ID     | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| User   | int(10) unsigned | NO   |     | NULL    |                |
| Anketa | int(10) unsigned | NO   |     | NULL    |                |
+--------+------------------+------+-----+---------+----------------+
Problém.
Štandardný dotaz, ktorý používam

Kód: Vybrať všetko

@$sql="select * from Ankety where Status='1'
funguje normálne. Zobrazí zoznam prebiehajúcich ankiet (zisťujem podľa čísla v stĺpci Status).
Čo ak ale chcem aby boli zo zoznamu (výsledku vyhľadávania) vyňaté Ankety ktoré už boli daným používateľom raz vyplnené?? (Na to služi tá tabuľka Vyplnene, ktorá nesie ID prihláseného usera (stlpec User) a ID ankety (stlpec Anketa) ktorú už vyplnil.

Ja už fakt neviem, nefunguju mi žiadne štandardné odkazovačky na viaccero tabuliek... .
Skúšal som

Kód: Vybrať všetko

select Ankety.Anketa as Anketa,Ankety.ID as ID from Ankety join Vyplnene ON Vyplnene.Anketa=Ankety.ID where Vyplnene.User!='61480' and Ankety.Status='1';
Ale má to dve chyby.
1/ Vráti to taký počet výsledkov koľko záznamov sa nachádza v tabuľke Vyplnene
2/ Vôbec sa mi nedarí mu povedať, že ak Vyplnene.User sa nenachadza v tabulke Vyplnene má tabuľku zobraziť. Ak sa nachádza -- nezobrazovať.

Ako by ste sformulovali dotaz aby to išlo?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa BX »

Podľa mňa by mohlo fungovať toto

Kód: Vybrať všetko

select * from Ankety 
LEFT JOIN Vyplnene ON(Ankety.ID = Vyplnene.Anketa)
where Vyplnene.ID IS NULL
Tzn. spravím LEFT JOIN Ankety s tabuľkou Vyplnene a vyberiem len tie záznamy, ku ktorým neexistuje záznam v tabuľke Vyplnene- čiže neexistuje vyplnená anketa.
Plus doplniť podmienku so statusom a užívateľom.
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa javatar »

ak sa moja trestiaca hlava nemyli tak by to mohlo byt ako

Kód: Vybrať všetko

select * from Ankety a LEFT JOIN Vyplnene v ON a.id = v.anketa WHERE a.status = '1' AND v.id is null AND v.user = 'prihlaseny user'
//edit: tak ma uz BX predbehol
Shakal
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 31 jan 2006, 18:54

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa Shakal »

BX napísal:Podľa mňa by mohlo fungovať toto
Tzn. spravím LEFT JOIN Ankety s tabuľkou Vyplnene a vyberiem len tie záznamy, ku ktorým neexistuje záznam v tabuľke Vyplnene- čiže neexistuje vyplnená anketa.
Plus doplniť podmienku so statusom a užívateľom.
No, lenže mi to nevracia žiaden výsledok --- t.j. žiadna bežiaca anketa...

Kód: Vybrať všetko

mysql> select * from Ankety LEFT JOIN Vyplnene ON(Ankety.ID = Vyplnene.Anketa) where Vyplnene.ID IS NULL;
Empty set (0.00 sec)
Je mi jasné že je kvôli tomu Vyplnene.ID IS NULL ale keď ho zmažem, tak mi vyhodí toľko rovnakých výsledkov, koľko záznamov sa nachádza v tabuľke Vyplnene s rovnakým ID (Ankety.ID = Vyplnene.Anketa)

Kód: Vybrať všetko

mysql> select * from Ankety LEFT JOIN Vyplnene ON(Ankety.ID = Vyplnene.Anketa) where Vyplnene.ID IS NOT NULL;
+----+-------------------------------------------------------------------------------------+---------------------+--------+------+------+--------+
| ID | Anketa                                                                              | Platnost_DO         | Status | ID   | User | Anketa |
+----+-------------------------------------------------------------------------------------+---------------------+--------+------+------+--------+
|  1 | Na základe akých kritérií ste sa rozhodli pre štúdium na škole                      | 2019-03-31 00:00:00 |      1 |    1 | 6180 |      1 |
|  1 | Na základe akých kritérií ste sa rozhodli pre štúdium na škole                      | 2019-03-31 00:00:00 |      1 |    3 | 6195 |      1 |
+----+-------------------------------------------------------------------------------------+---------------------+--------+------+------+--------+
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa javatar »

nie je to nahodou preto, lebo to pozeras pre usera ktory ma vsetky ankety uz vyplnene? myslim teraz preco ti nejde to Vyplnene.ID is NuLL
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa BX »

Ukáž výpis dotazu
select * from Ankety LEFT JOIN Vyplnene ON(Ankety.ID = Vyplnene.Anketa)
Shakal
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 31 jan 2006, 18:54

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa Shakal »

Nefunguje to chlapci, posielam radšej výpis tabuliek aby ste vedeli ako to vypadá. Som z toho jeleň.

Kód: Vybrať všetko

mysql> select * from Ankety LEFT JOIN Vyplnene ON(Ankety.ID = Vyplnene.Anketa);
+----+-------------------------------------------------------------------------------------+---------------------+--------+------+------+--------+
| ID | Anketa                                                                              | Platnost_DO         | Status | ID   | User | Anketa |
+----+-------------------------------------------------------------------------------------+---------------------+--------+------+------+--------+
|  1 | Na základe akých kritérií ste sa rozhodli pre štúdium na škole                      | 2019-03-31 00:00:00 |      1 |    1 | 6180 |      1 |
|  1 | Na základe akých kritérií ste sa rozhodli pre štúdium na škole                      | 2019-03-31 00:00:00 |      1 |    3 | 6195 |      1 |
+----+-------------------------------------------------------------------------------------+---------------------+--------+------+------+--------+
2 rows in set (0.00 sec)

Kód: Vybrať všetko

mysql> select * from Ankety;
+----+-------------------------------------------------------------------------------------+---------------------+--------+
| ID | Anketa                                                                              | Platnost_DO         | Status |
+----+-------------------------------------------------------------------------------------+---------------------+--------+
|  1 | Na základe akých kritérií ste sa rozhodli pre štúdium na škole                      | 2019-03-31 00:00:00 |      1 |
+----+-------------------------------------------------------------------------------------+---------------------+--------+
1 row in set (0.00 sec)

Kód: Vybrať všetko

mysql> select * from Vyplnene;
+----+------+--------+
| ID | User | Anketa |
+----+------+--------+
|  1 | 6180 |      1 |
|  3 | 6195 |      1 |
+----+------+--------+
2 rows in set (0.00 sec)
Viete, problém je v tom, že na výstupe potrebujem LEN JEDEN ZÁZNAM/Anketa
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa BX »

Máš tam nejako málo dát na to, aby si niečo videl. Pridaj tam niečo, hlavne nejakú druhú anketu, ktorá by mohla byť niekým nevyplnená.
Aha http://sqlfiddle.com/#!9/6f5f8/15
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa javatar »

tak poriadne citaj prispevky
javatar napísal:nie je to nahodou preto, lebo to pozeras pre usera ktory ma vsetky ankety uz vyplnene? myslim teraz preco ti nejde to Vyplnene.ID is NuLL
select ktory som ti poslal ja a BX funguje - kedze user ma vyplnene vsetky ankety tak ma vratit 0 riadkov (co aj vrati)

teda za predpokladu,ze chces stale zobrazit userovi vsetky ankety ktore este este nevyplnil
Shakal
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 31 jan 2006, 18:54

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa Shakal »

BX napísal:Máš tam nejako málo dát na to, aby si niečo videl. Pridaj tam niečo, hlavne nejakú druhú anketu, ktorá by mohla byť niekým nevyplnená.
Aha http://sqlfiddle.com/#!9/6f5f8/15
Na tom Tvojom príklade akosika nechápem, prečo Ti tam teda ukazuje (výstup) len Anketu č.3, keď podľa tých dát by si mal mať aktívnu aj č.1

//autoeditácia príspevku (19 Mar 2015, 12:01)
javatar napísal:tak poriadne citaj prispevky


select ktory som ti poslal ja a BX funguje - kedze user ma vyplnene vsetky ankety tak ma vratit 0 riadkov (co aj vrati)

teda za predpokladu,ze chces stale zobrazit userovi vsetky ankety ktore este este nevyplnil
Veď to je ten problém, že to tak nie je. Nefunguje to.

Aha:

Kód: Vybrať všetko

mysql> select * from Ankety a LEFT JOIN Vyplnene v ON a.id = v.anketa WHERE a.status = '1' AND v.id is null AND v.user = 'hocico_co_vo_Vyplnene_nie_je';
Empty set (0.00 sec)
Malo mi vrátiť ANKETU s ID1 nakoľko sa snažím zistiť, či vo Vyplnené je nejaký záznam odkazujúci sa na usera 'hocico_co_vo_Vyplnene_nie_je'. A taký záznam tam NIE JE.
Mám sa teda dôvod domnievať, že užívateľ túto anketu ešte nevyplnil, takže mu ju chcem ukázať.
Ale ako vidíte,,,, Empty....

//autoeditácia príspevku (19 Mar 2015, 12:05)

//autoeditácia príspevku (19 Mar 2015, 12:06)

Na tom Tvojom príklade akosika nechápem, prečo Ti tam teda ukazuje (výstup) len Anketu č.3, keď podľa tých dát by si mal mať aktívnu aj č.1
Beriem späť, už chápem prečo Ti to nezobrazuje.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa BX »

Dobre, tak na to poďme úplne hlúpo a potom to môžeme vylepšiť keď tak.
Toto už funguje podľa tvojích predstáv?

Kód: Vybrať všetko

SELECT *
FROM Ankety
WHERE Ankety.ID NOT IN
(
SELECT Vyplnene.Anketa FROM Vyplnene
WHERE Vyplnene.User=1
)
Tzn. vyberiem všetky ankety a odstránim tie, ktoré má user vyplnené.
Shakal
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 31 jan 2006, 18:54

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa Shakal »

BX napísal:Dobre, tak na to poďme úplne hlúpo a potom to môžeme vylepšiť keď tak.
Toto už funguje podľa tvojích predstáv?

Kód: Vybrať všetko

SELECT *
FROM Ankety
WHERE Ankety.ID NOT IN
(
SELECT Vyplnene.Anketa FROM Vyplnene
WHERE Vyplnene.User=1
)
Tzn. vyberiem všetky ankety a odstránim tie, ktoré má user vyplnené.
VĎAKA.
Presne toto "hlúpe" som potreboval. :D
Už to funguje konečne presne tak ako som to tu celú dobu chcel.


BX +K
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa javatar »

:lol: a ja si hovorim, ze toto riesenie mu sem nedam, to je prilis lamacke a radsej si zopakujem joiny
Shakal
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 31 jan 2006, 18:54

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa Shakal »

javatar napísal::lol: a ja si hovorim, ze toto riesenie mu sem nedam, to je prilis lamacke a radsej si zopakujem joiny
Však to sprav cez joiny keď si frajer.
Pastni fungujúce riešenie a nazvem Ťa majstrom :P
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa BX »

Podarilo sa... asi. Ale to jednoduché riešenie je určite lepšie :lol:

Kód: Vybrať všetko

SELECT AnketaName
FROM
(
 SELECT *
 FROM Ankety ank1 
 CROSS JOIN Vyplnene vyp1
 WHERE vyp1.User=1
) AS tab1
LEFT JOIN 
(SELECT * FROM Vyplnene WHERE User=1) AS tab2 ON(tab2.Anketa = tab1.AID)
WHERE tab2.VID IS NULL
GROUP BY tab1.AID
http://sqlfiddle.com/#!9/10f77/29
Kto vie, či sa to dá zjoinovať jednoduchšie...

(áno, trocha sa nudím a čo?!)
Shakal
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 206
Registrovaný: 31 jan 2006, 18:54

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa Shakal »

BX

Majstre, budete ma učiť?!
:aasmile4: :happyrespect:

(to nevadí, ja tiež.)
*****HERO*****
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2446
Registrovaný: 08 máj 2006, 1:34

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa *****HERO***** »

oh shit, co za litanie vy tu vystrajate

co tak takto?

Kód: Vybrať všetko

SELECT Ankety.Anketa
FROM Ankety
LEFT JOIN Vyplnene ON Vyplnene.Anketa = Ankety.ID AND Vyplnene.User != '{ID_USERA}'
GROUP BY Ankety.ID
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa BX »

Veru na JOIN na viacerych stĺpcoch som už aj zabudol. Len si to mohol nechať tak, ako si to napísal najskôr (ak sa mi to nesnívalo)

Kód: Vybrať všetko

SELECT Ankety.Anketa
FROM Ankety
LEFT JOIN Vyplnene ON Vyplnene.Anketa = Ankety.ID AND Vyplnene.User != '{ID_USERA}'
WHERE Vyplnene.ID IS NULL
*****HERO*****
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2446
Registrovaný: 08 máj 2006, 1:34

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa *****HERO***** »

hej, mal som to tak, ale paci sa mi viac to druhe riesenie :) neviem ako je to s performance tho
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Ako sformulovať jeden MySQL dotaz na viaccero tabuliek?

Príspevok od používateľa BX »

Ale to s GROUP BY nefunguje.
Napísať odpoveď