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.
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
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. ;)
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?
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
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
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.
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
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 ...
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
136 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe