WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MySQL förklaring på Intersection och Union (https://www.wn.se/forum/showthread.php?t=1040058)

grinditwp 2010-01-17 19:57

MySQL förklaring på Intersection och Union
 
Kan någon förklara dessa två mysql anropen, som jag hittat här http://www.pui.ch/phred/archives/200...e-schemas.html

PHP-kod:

SELECT b.*
FROM tagmap btbookmark btag t
WHERE bt
.tag_id t.tag_id
AND (t.name IN ('bookmark''webservice''semweb'))
AND 
b.id bt.bookmark_id
GROUP BY b
.id
HAVING COUNT
b.id )=

och

PHP-kod:

SELECT b.*
FROM tagmap btbookmark btag t
WHERE bt
.tag_id t.tag_id
AND (t.name IN ('bookmark''webservice''semweb'))
AND 
b.id bt.bookmark_id
GROUP BY b
.id 

I första exemplet är det meningen att vi ska hämta ut bookmarks med taggarna bookmark och webservice och semweb och i andra skall vi hämta bookmarks med bookmark eller webservice eller semweb.

Men vid tester så gör exempel ett samma sak som exempel 2 skall göra, jag hittar alltså resultat oavsett om alla tre eller bara en av dem finns som tag.

Vad gör t.ex. GROUP BY b.id HAVING COUNT( b.id )=3 för skillnad?

Om någon är villig att förklara båda exemplen skulle jag bli glad. :)

Westman 2010-01-17 20:15

Hmm, HAVING COUNT( b.id )=3 betyder väl att den ska visa b.* för de rader i tabell som har sitt id även i webservice och semweb?

grinditwp 2010-01-17 22:39

förstår inte riktigt...

låt oss säga att jag vill hitta alla bookmarks med taggarna BOLL och SPORT.

Då fungerar;

PHP-kod:

SELECT b.*
FROM tagmap btbookmark btag t
WHERE bt
.tag_id t.tag_id
AND (t.name IN ('boll''sport'))
AND 
b.id bt.bookmark_id
GROUP BY b
.id
HAVING COUNT
b.id )=

och jag hittar 1 bookmark, för det finns bara 1 bookmark med dessa två taggarna. Det finns flera bookmarks med taggen SPORT. So far so good!

Men låt oss testa systemet, söker jag på BOLL och KJHAJSGHAGS, vart på KJHAJSGHAGS är en tagg jag vet INTE existerar.

PHP-kod:

SELECT b.*
FROM tagmap btbookmark btag t
WHERE bt
.tag_id t.tag_id
AND (t.name IN ('boll''KJHAJSGHAGS'))
AND 
b.id bt.bookmark_id
GROUP BY b
.id
HAVING COUNT
b.id )=

..så hittar jag fortfarande en bookmark. Samma som vid första sökningen.... varför?

För att göra det ännu snurrigare och testar att lägga till en tagg till vi vet inte existerar.

PHP-kod:

SELECT b.*
FROM tagmap btbookmark btag t
WHERE bt
.tag_id t.tag_id
AND (t.name IN ('boll''KJHAJSGHAGS''AAAKJSL'))
AND 
b.id bt.bookmark_id
GROUP BY b
.id
HAVING COUNT
b.id )=

..så hittar vi inget. Som vi förväntat oss redan i exempel 2.

Westman 2010-01-18 08:48

Ok. Jag körde detta på en tabell som jag har:
Kod:

SELECT Fornamn
FROM patient
GROUP BY Fornamn
HAVING COUNT(Fornamn) = 3

och den listar alla förnamn som det finns tre av. Det borde betyda att du har två träffar i tabell t på ordet boll, har du det?

grinditwp 2010-01-19 15:19

Citat:

Ursprungligen postat av Westman (Inlägg 20339506)
Ok. Jag körde detta på en tabell som jag har:
Kod:

SELECT Fornamn
FROM patient
GROUP BY Fornamn
HAVING COUNT(Fornamn) = 3

och den listar alla förnamn som det finns tre av. Det borde betyda att du har två träffar i tabell t på ordet boll, har du det?

Hum.. då är exemplen på sidan jag tittade fel. :S

Enligt dem skall exemplet vara lika med en sökning "BOLL + SPORT" alltså BOLL AND SPORT.
Vilket borde betyda om inte båda finns så hittas inget.

Hur skulle ett sådant anrop sett ut då, med samma struktur? Vill gärna kunna göra allt i ett anrop och slippa massa loopar.

Westman 2010-01-19 18:44

Om jag ska gissa hur du har tänkt att tabellerna ska fungera så vill du inte ha samma name och tag_id två gånger i tabellen tag. Har du verkligen boll två gånger i tag med samma tag_id?

Westman 2010-01-20 09:43

Om den visar en rad från tabellen b vars id _inte_ har en koppling till ett tag_id i tabellen bt med motsvarande t.name=sport så måste det finnas två rader i tabellen bt som motsvarar t.name=boll

Det är min teori. Jag har skickat den till en SQL-guru för verifiering så om jag inte rättar mig så finns det dubletter på ett av dina sökord.


Alla tider är GMT +2. Klockan är nu 17:36.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson