Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Tagga blogginlägg...

Postades av 2008-02-24 20:28:19 - Tommy Leandersson, i forum mysq, Tråden har 12 Kommentarer och lästs av 1361 personer

Jag har en blogg... nu vill jag tagga mina blogginlägg så man snabbt hittar likartade inlägg. Att söka reda på en tagg går enkelt, men hur löser man det om man vill att två eller fler måste stämma överens för att blogginlägget skall visas?

Fick tips om denna SQL-sats, där man har bloggen, matchningar och tagg-ord i tre separata tabeller och sen stoppar in orden i en IN-sats.

Select bloggar.bloggid from
bloggar,
bloggmatchar,
bloggtaggar
where
bloggar.bloggid = bloggmatchar.bloggid and
blogmatchar.taggid = bloggtaggar.taggid and
bloggtaggar.namn in ('öl', 'chips')

Dock så tar denna med alla inlägg som har "öl" eller "chips" som tagg ord... inte "öl" och "chips".

Hur löser man sådant här? Har ni några idéer eller kan tipsa om någon artikel eller sökord på nätet som man kan läsa mera på?


Svara

Sv: Tagga blogginlägg...

Postades av 2008-02-24 22:02:28 - Niklas Jansson

Vad är det i dina tabeller?
De har inte så talande namn...

Det enklaste (om du inte ska göra mer avancerad sökning) är mängdoperationer.


Svara

Sv:Tagga blogginlägg...

Postades av 2008-02-25 07:13:42 - Tommy Leandersson

Detta är bara namn tagna ur luften...

Tabell "bloggar" skulle då vara "id" och "blogg text", tabell "bloggmatchar" är en koppling mellan "blogg id" och "tagg id". Så att man kan återanvända alla tagg namnen och till slut så har vi tabellen "bloggtaggar" som innhåller ett "ID" och ett "tagg ord".


Svara

Sv: Tagga blogginlägg...

Postades av 2008-02-25 10:41:44 - Niklas Jansson

Ok, "bloggmatchar" var väl lite skumt. Jag skulle kallat det bloggar, taggar och bloggtaggar.
Hur som helst, det "enklaste" är att bygga upp ett stort uttryck (jag kör med mina namn för att göra det enklare att skriva):

1. Hämta ut ett taggID
SELECT TaggID FROM Taggar WHERE TaggOrd = "Öl"

2. Hämta ut alla blogginlägg som har den taggen
SELECT BloggID FROM Bloggtaggar WHERE TaggID = (SELECT TaggID FROM Taggar WHERE TaggOrd = "Öl")

3. Gör samma sak, fast för den andra taggen
SELECT BloggID FROM Bloggtaggar WHERE TaggID = (SELECT TaggID FROM Taggar WHERE TaggOrd = "Chips")

4. Ta bara de BloggID:na som finns i båda
(SELECT BloggID FROM Bloggtaggar WHERE TaggID = (SELECT TaggID FROM Taggar WHERE TaggOrd = "Öl"))
INTERSECT
(SELECT BloggID FROM Bloggtaggar WHERE TaggID = (SELECT TaggID FROM Taggar WHERE TaggOrd = "Chips"))

5. Använd detta för att få fram all blogginlägg
SELECT BloggID, BloggText FROM Bloggar WHERE BloggID IN
((SELECT BloggID FROM Bloggtaggar WHERE TaggID = (SELECT TaggID FROM Taggar WHERE TaggOrd = "Öl"))
INTERSECT
(SELECT BloggID FROM Bloggtaggar WHERE TaggID = (SELECT TaggID FROM Taggar WHERE TaggOrd = "Chips")))

Ytterligare en variant är att hämta ut alla och räkna antalet:
SELECT BloggID FROM (SELECT BloggID FROM BloggTaggar NATURAL JOIN Taggar WHERE TaggID IN ("Öl", "Chips")) GROUP BY BloggID HAVING COUNT(BloggID) = 2

2:an måste anpassas till antalet ord. Om man vill ha något i stil med ("A" OCH "B") ELLER "C" så är den första varianten att föredra (och det kanske är omöjligt att lösa det med den andra).


Svara

Sv:Tagga blogginlägg...

Postades av 2008-02-25 11:09:40 - Tommy Leandersson

Det där såg intressant ut... :)

Namnen är som sagt var inte jag som pillade ihop, utan fick den ifrån en annan... jag byggde en testvariant med INSTR som fungerade klockrent, men istället fick man en TABLE-scan på databasen som kanske inte är att föredra... Då låg alla bloggtaggar i samma fält...

Då fick jag detta uppbyggnadstips med namnen. Efter lite tester så insåg att det inte fungerade som jag ville och av lat het så skrev jag inte om dessa vid mitt prov och postade detta här i forumet...

Hur blir bealstningen på MySQL-server om man kör detta eller om man skulle lägga alla ord i ett fält och köra "MATCH" på dessa istället?


Svara

Sv: Tagga blogginlägg...

Postades av 2008-02-26 07:30:32 - Tommy Leandersson

Då så...

Löste det med hjälp av denna, med lite modifikation... ska prova att skriva om den och bygga bort IN-satserna vid senare tillfälle så därför så visar jag inte den färdiga SQL-satsen.

SELECT BloggID FROM (SELECT BloggID FROM BloggTaggar NATURAL JOIN Taggar WHERE TaggID IN ("Öl", "Chips")) GROUP BY BloggID HAVING COUNT(BloggID) = 2

Den är lätt att utöka med flera ord CB därav anledningen till att jag gick vidare med denna...

Tack Niklas...


Svara

Sv:Tagga blogginlägg...

Postades av 2008-02-26 10:50:34 - Niklas Jansson

"bygga bort IN-satserna"?

<b>>Den är lätt att utöka med flera ord CB därav anledningen till att jag gick vidare med denna...</b>
Notera bara att du enbart kommer kunna få "exakt alla de här orden måste vara med". Ska du ha mer generella villkor får du ta det första alternativet.


Svara

Sv: Tagga blogginlägg...

Postades av 2008-02-26 11:41:59 - Tommy Leandersson

Jepp jag vet, men det är det som jag är ute efter är just enbart att få med de specifika som man valt...

Bygga bort IN menar jag med att ersätta dessa med JOIN eftersom IN är prestandakrävande, i alla fall enl. denna artikel http://www.aspsidan.se/default.asp?page=readArticle&artId=615


Svara

Sv:Tagga blogginlägg...

Postades av 2008-02-26 12:58:22 - Niklas Jansson

Förutom att den artikeln pratar om IN(SELECT ...).
Här är det tvärtom, här måste du lägga in dem i en temporär tabell först. I vissa fall är det snyggare och möjligtvis snabbare, men knappast här.

Sen ska man tänka på två grejer:
1. Preoptimization is the root of all evil.
2. Det är helt och hållet beroende på databasmotor, index osv. Ändra inte utan att göra en kontroll på att det faktiskt går fortare...


Svara

Sv: Tagga blogginlägg...

Postades av 2008-02-26 14:51:07 - Tommy Leandersson

Så sant så sant... Jag har ju min SQL-sats som jag pillat ihop och gör jag om den till JOIN så är det snabbt att kolla via phpMyAdmin ev. tidsvinsten...

Tack igen Niklas!


Svara

Sv:Tagga blogginlägg...

Postades av 2008-02-27 05:43:30 - Tommy Leandersson

Nu har jag provat att leka lite med denna...
SELECT BloggID FROM (SELECT BloggID FROM BloggTaggar NATURAL JOIN Taggar WHERE TaggID IN ("Öl", "Chips")) GROUP BY BloggID HAVING COUNT(BloggID) = 2

BloggID i "SELECT BloggID FROM (SEL... " är det i tabellen "BloggTaggar" eller är du "nere" i det du kallar "Bloggar"? För som jag får till det så är jag kvar i " taggar och bloggtaggar" och för att plocka t.ex. title så måse jag JOINA denna med ytterligare en tabell "Bloggar". Det lättaste sättet hade varit att köra med IN men då är man där enl. artiklen om prestanda skillnader.

Nu är jag här i min SQL-sats...
-------------------------------------------------------------------------------------------------------------
SELECT `id`, `title`, `text`, `date` FROM bloggar LEFT JOIN (SELECT BloggID FROM BloggTaggar NATURAL JOIN Taggar WHERE TaggName IN ('Öl','Chips')) as newMatchtable ON BloggID = id GROUP BY BloggID HAVING COUNT(BloggID) = 2


Svara

Sv: Tagga blogginlägg...

Postades av 2008-02-27 09:09:32 - Niklas Jansson

<b>>BloggID i "SELECT BloggID FROM (SEL... " är det i tabellen "BloggTaggar" eller är du "nere" i det du kallar "Bloggar"?</b>
Eftersom jag inte anropar "Bloggar" öht så är det från BloggTaggar

<b>>För som jag får till det så är jag kvar i " taggar och bloggtaggar" och för att plocka t.ex. title så måse jag JOINA denna med ytterligare en tabell "Bloggar". Det lättaste sättet hade varit att köra med IN men då är man där enl. artiklen om prestanda skillnader. </b>
Ja, där är det en join som är aktuell, men skriv det som;
SELECT `id`, `title`, `text`, `date` FROM bloggar LEFT JOIN (SELECT BloggID FROM BloggTaggar NATURAL JOIN Taggar WHERE TaggName IN ('Öl','Chips') GROUP BY BloggID HAVING COUNT(BloggID) = 2) as newMatchtable ON BloggID = id

så kör du group by före yttre joinen


Svara

Sv:Tagga blogginlägg...

Postades av 2008-02-27 11:04:44 - Tommy Leandersson

Okidoo... man lär sig nya saker hela tiden... :)

Tack igen...


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 153
27 952
271 704
834
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies