Vinnaren i pepparkakshustävlingen!
2011-03-24, 12:27
  #1
Avstängd
Hej,
Nu behöver jag verkligen hjälp med en sökfunktion. Har setat i tre dagar utan att komma fram till en lösning. Nu är jag tillbaks på ruta 1. Skulle uppskatta hjälp nå enormt.

Börjar med att slänga upp tabeller:
Kod:
tabell1
id    titel
-----------------
1     titel till id1
2     titel till id2
3     titel till id3
Kod:
tabell2
id     uid     namn
-----------------------
1       1      namn1
2       2      namn2
3       2      namn2_2
4       3      namn3

Det jag vill åstadkomma med dessa två tabeller nu är följande. Söker man på titel till id1 (tabell1) så blir sökresultatet titel till id1.

Söker man sen på namn2 så blir sökresultatet titel till id2 (Anledningen är att namn2 har uid 2 som tillhör id2 från tabell1).

Söker man på namn2 namn2_2 blir resultatet titel till id2.

Hoppas att någon förstår mitt problem och kan ta sig tid att hjälpa mig. Vet att det är mycket begärt men du gör något gott, jag lovar.
Citera
2011-03-24, 12:32
  #2
Medlem
demitos avatar
Jag är självlärd på SQL så nån kommer säkert peka ut någon fundamental brist i vad jag skriver, men kan man inte göra det så här ungefär?

SELECT tabell1.titel FROM tabell1, tabell2 WHERE tabell2.name = ? AND tabell1.id = tabell2.uid
Citera
2011-03-25, 00:32
  #3
Avstängd
Citat:
Ursprungligen postat av demito
Jag är självlärd på SQL så nån kommer säkert peka ut någon fundamental brist i vad jag skriver, men kan man inte göra det så här ungefär?

SELECT tabell1.titel FROM tabell1, tabell2 WHERE tabell2.name = ? AND tabell1.id = tabell2.uid

Jag får tacka så mycket. Byggde vidare på den och jag tror det löste sig galant. I grund och botten blev det en utveckling av denna fråga: (Ifall andra vill ta del av detta).
Kod:
$stm = $dbh->prepare("SELECT * FROM
tabell1 AS t1, tabell2 AS t2
WHERE (MATCH(t2.namn) AGAINST ('$keywords' IN BOOLEAN MODE) OR MATCH(t1.titel) AGAINST ('$keywords' IN BOOLEAN MODE))
AND t1.id = t2.uid"
Citera
2011-03-25, 09:06
  #4
Medlem
gadzooxs avatar
Citat:
Ursprungligen postat av demito
Jag är självlärd på SQL så nån kommer säkert peka ut någon fundamental brist i vad jag skriver, men kan man inte göra det så här ungefär?

SELECT tabell1.titel FROM tabell1, tabell2 WHERE tabell2.name = ? AND tabell1.id = tabell2.uid
Inte annat än att en explicit join är mer lättläst och att det då går att göra left/right outer joins mycket enklare, bara att byta ut ett keyword istället för att hålla på och mecka med WHERE-predikaten...
Kod:
SELECT t1.titel
FROM tabell1 t1
INNER JOIN tabell2 t2 ON t1.id = t2.uid
WHERE (
   MATCH(t2.namn) AGAINST ('$keywords' IN BOOLEAN MODE)
   OR MATCH(t1.titel) AGAINST ('$keywords' IN BOOLEAN MODE)
)

Har dessutom för mig att jag hört något om att implicit joins (det du visade) är deprecated, men ta inte mitt ord på det. Det kan lika gärna vara implicit outer join-operatorn *= som är deprecated. Lika bra det...
Citera
2011-03-25, 13:30
  #5
Avstängd
Citat:
Ursprungligen postat av gadzoox
Inte annat än att en explicit join är mer lättläst och att det då går att göra left/right outer joins mycket enklare, bara att byta ut ett keyword istället för att hålla på och mecka med WHERE-predikaten...
Kod:
SELECT t1.titel
FROM tabell1 t1
INNER JOIN tabell2 t2 ON t1.id = t2.uid
WHERE (
   MATCH(t2.namn) AGAINST ('$keywords' IN BOOLEAN MODE)
   OR MATCH(t1.titel) AGAINST ('$keywords' IN BOOLEAN MODE)
)

Har dessutom för mig att jag hört något om att implicit joins (det du visade) är deprecated, men ta inte mitt ord på det. Det kan lika gärna vara implicit outer join-operatorn *= som är deprecated. Lika bra det...

Ja, bättre att köra INNER JOIN. Fick dock inte till det med INNER JOIN och Match Against förut men nu verkar det ha ordnat det upp sig, måste ha gjort någon tabbe. Tack.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback