Hej jag är i behov av en sql-fråga som jag inte riktigt själv vet hur jag ska formulera.
Den ska välja alla rader i en databas som under rubriken bilar har endast sådana bilar som man sökt efter.
T.ex. om man söker med sökorden: 'volvo saab opel' ska man få upp alla rader med poster som har något eller alla tre av dessa bilar, ex: 'volvo saab', 'saab opel' eller 'volvo', dock ej t.ex. 'volvo saab jaguar'.
Databasen ska se ut typ såhär:
Namn Bilar
Jönsson Saab, Opel, Volvo
Nilsson Jaguar, BMW
Karlsson Saab, Volvo, Jaguar
osv...
Söker jag på 'Saab Volvo Opel BMW' ska således endast Jönsson väljas. Söker jag däremot på 'Saab Opel Volvo Jaguar' ska både Jönsson och Karlsson väljas.
Så hur kan man utforma en sådan SQL-fråga??
Tack på Förhand!!
LaspMedlem sedan juli 200012 980 inlägg Hej Jag tycker inte att ditt sökkriterie stämmer!
Eller är jag ute och reser?
Jesper TMedlem sedan nov. 20017 144 inlägg Jag föreslår tre tabeller.
En med bilhandlare en med märken och en som joinar ihop bilhandlare med märken.
tabell_bilhandlare
id, namn
tabell_bilmärken
id, märke
tablell_bilhandlare-bilmärken
bh_id, bm_id
Raderna som väljs får under posten bilar innehålla något eller alla sökorden, men inga andra. Det som diskvalificierar en rad är således om den innehåller något bilmärke som inte finns bland sökorden
Jesper T: Hur skulle det förenkla sökningen?? Förstår inte hur du tänkt
cyprysMedlem sedan dec. 20003 563 inlägg Om jag förstår rätt har du en kolumn som innehåller alla bilar en bilhandlare säljer. Varje bilmärke skiljs åt med komma i den kolumnen vilket är 'fel' i databasmening. Istället ska du bygga upp databasen såsom JesperT skrivit.
Du skapar du en normaliserad databas där man enkelt kan koppla ihop varje bilmärke med en försäljare.
Den stora nackdelen med din lösning är att det inte finns något smidigt sätt att söka igenom delsträngar i din kolumn genom SQL. Man får då problem som du nyligen upptäckt. ;)
LaspMedlem sedan juli 200012 980 inlägg Borde inte BMW ta med Nilsson då? I annat fall skall väl inte ens Jönsson vara med eftersom han inte har BMW?
Okej jag förstår lite, så jag skapar tabeller som ser ut som följer:
tabell_bilhandlare
id namn
1 Jönsson
2 Karlsson
3 Nilsson
tabell_bilmarken
id marke
1 Jaguar
2 Volvo
3 Saab
4 Opel
5 BMW
Tabell_bilhandlare_bilmarken
bh_id bm_id
1 3
1 4
1 2
2 3
2 2
2 1
3 1
3 5
Söker jag på 'Saab Volvo Opel BMW' ska vill jag ju endast att Jönsson väljs. Söker jag däremot på 'Saab Opel Volvo Jaguar' ska både Jönsson och Karlsson väljas.
Men hur skulle i så fall sökningen fungera så som jag vill ha den?
LarsGMedlem sedan dec. 200012 464 inlägg select bilhandlare
from bilhandlare bh
inner join bilhandlare_bilmarken bb on bh.id = bb.bh_id
inner join bilmarken bm on bb.bm_id = bm.id
where marke in ('Saab','Volvo','Opel','BMW')
group by bilhandlare
having count(*) = (select count(*)
from bilhandlare_bilmarken bb2
where bb.bh_id = bb2.bh_id)
Okej, förstår inte riktigt koden och kan då inte felsöka,
men fick ett fel:
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT COUNT( * )
FROM tabell_bilhandlare_bilmarken bb2
WHER
SQL-fråga :
SELECT namn
FROM tabell_bilhandlare bh
INNER JOIN tabell_bilhandlare_bilmarken bb ON bh.id = bb.bh_id
INNER JOIN tabell_bilmarken bm ON bb.bm_id = bm.id
WHERE marke
IN (
'Saab', 'Volvo', 'Opel', 'BMW'
)
GROUP BY namn
HAVING COUNT( * ) = (
SELECT COUNT( * )
FROM tabell_bilhandlare_bilmarken bb2
WHERE bb.bh_id = bb2.bh_id )
LIMIT 0 , 30
´
Vad beror det på?
Tack på förhand!!
LarsGMedlem sedan dec. 200012 464 inlägg Att du har en uråldrig version av Mysql. Uppgradera.
Ajdå, där ser man. Det finns inga andra svängar omkring? Mitt webhotell tänker nog inte uppgradera det på direkten. Sitter på version: MySQL 4.0.24_Debian-10-log
Hej
LarsGMedlem sedan dec. 200012 464 inlägg Jag ser ingen möjlighet att skriva detta som en fråga utan att använda subselect.
Det alternativ som jag ser är att skapa en temporärtabell som innehåller bilhandlare och antalet modeller som dom tillhandahåller och sedan använda den.
Okej, det var tråkiga nyheter. men hur skulle man kunna få fram denna temporära tabell med hjälp utav SQL?
LarsGMedlem sedan dec. 200012 464 inlägg create temporary table tbh(bh_id int, models int)
insert into tbh select bh_id ,count(*)
from tabell_bilhandlare_bilmarken bb
group by bh_id
SELECT namn
FROM tabell_bilhandlare bh
inner join tbh on bh.id = tbh.bh_id
INNER JOIN tabell_bilhandlare_bilmarken bb ON tbh.bh_id = bb.bh_id
INNER JOIN tabell_bilmarken bm ON bb.bm_id = bm.id
WHERE marke
IN (
'Saab', 'Volvo', 'Opel', 'BMW'
)
GROUP BY namn
HAVING COUNT( * ) = tbh.models
order by namn
limit 0,30
drop table tbh
Ungefär.
Inte löst sig ännu!
Hej igen, det fungerade inte heller,
#1064 - You have an error in your SQL syntax
near 'INSERT INTO tbh
SELECT bh_id, count( * )
FROM tabell_bilhan ...
för gammal version även för detta eller?
Jesper TMedlem sedan nov. 20017 144 inlägg Testa detta
insert into tbh (bh_id, models) select bh_id ,count(*)
from tabell_bilhandlare_bilmarken bb
group by bh_id
dr_damirMedlem sedan mars 2003132 inlägg Jag testade denna men det fungerade inte. Jag får felmeddelandet:
#1054 - Unknown column 'tbh.models' in 'having clause'
Ja det stämmer!
Ja får också det felmeddelandet som dr_damir får:
#1054 - Unknown column 'tbh.models' in 'having clause'
den hittar alltså inte tbh.models??
Vad gör man åt det??
tack på förhand
Ny SQL-server
ok jag har nu uppdaterad sql-servern till senaste icke-beta versionen 4.1.12a-nt, och jag får inte längre ett syntaxfel på frågan:
SELECT namn
FROM tabell_bilhandlare bh
INNER JOIN tabell_bilhandlare_bilmarken bb ON bh.id = bb.bh_id
INNER JOIN tabell_bilmarken bm ON bb.bm_id = bm.id
WHERE marke
IN (
'Saab', 'Volvo', 'Opel', 'BMW'
)
GROUP BY namn
HAVING COUNT( * ) = (
SELECT COUNT( * )
FROM tabell_bilhandlare_bilmarken bb2
WHERE bb.bh_id = bb2.bh_id )
LIMIT 0 , 30
Fick felmeddelandet:
Unknown column 'bb.bh_id' in 'where clause'
Har någon måhända tid att klura ut det här??
Isåfall, tack på förhand