Kom ihåg mig?
Home Menu

Menu


MySQL förklaring på Intersection och Union

Ämnesverktyg Visningsalternativ
Oläst 2010-01-17, 19:57 #1
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
Standard 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.

Senast redigerad av grinditwp den 2010-01-17 klockan 20:00
grinditwp är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-01-17, 20:15 #2
Westmans avatar
Westman Westman är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jun 2004
Inlägg: 4 021
Westman Westman är inte uppkopplad
Klarade millennium-buggen
Westmans avatar
 
Reg.datum: Jun 2004
Inlägg: 4 021
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?
Westman är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-01-17, 22:39 #3
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
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.

Senast redigerad av grinditwp den 2010-01-17 klockan 22:43
grinditwp är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-01-18, 08:48 #4
Westmans avatar
Westman Westman är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jun 2004
Inlägg: 4 021
Westman Westman är inte uppkopplad
Klarade millennium-buggen
Westmans avatar
 
Reg.datum: Jun 2004
Inlägg: 4 021
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?
Westman är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-01-19, 15:19 #5
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
grinditwp grinditwp är inte uppkopplad
Flitig postare
 
Reg.datum: Mar 2008
Inlägg: 320
Citat:
Ursprungligen postat av Westman Visa inlägg
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.
grinditwp är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-01-19, 18:44 #6
Westmans avatar
Westman Westman är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jun 2004
Inlägg: 4 021
Westman Westman är inte uppkopplad
Klarade millennium-buggen
Westmans avatar
 
Reg.datum: Jun 2004
Inlägg: 4 021
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 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-01-20, 09:43 #7
Westmans avatar
Westman Westman är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jun 2004
Inlägg: 4 021
Westman Westman är inte uppkopplad
Klarade millennium-buggen
Westmans avatar
 
Reg.datum: Jun 2004
Inlägg: 4 021
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.
Westman är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 05:29.

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