webForumDet fria alternativet

Avancerad databassökning

21 svar · 767 visningar · startad av EnLitenDelfin

EnLitenDelfinMedlem sedan dec. 200421 inlägg
#1

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 200010 197 inlägg
#2

Hej Jag tycker inte att ditt sökkriterie stämmer!
Eller är jag ute och reser?

Jesper TMedlem sedan nov. 20017 058 inlägg
#3

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

EnLitenDelfinMedlem sedan dec. 200421 inlägg
#4

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

EnLitenDelfinMedlem sedan dec. 200421 inlägg
#5

Jesper T: Hur skulle det förenkla sökningen?? Förstår inte hur du tänkt

cyprysMedlem sedan dec. 20003 105 inlägg
#6

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 200010 197 inlägg
#7

Borde inte BMW ta med Nilsson då? I annat fall skall väl inte ens Jönsson vara med eftersom han inte har BMW?

EnLitenDelfinMedlem sedan dec. 200421 inlägg
#8

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 465 inlägg
#9
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)
EnLitenDelfinMedlem sedan dec. 200421 inlägg
#10

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 465 inlägg
#11

Att du har en uråldrig version av Mysql. Uppgradera.

EnLitenDelfinMedlem sedan dec. 200421 inlägg
#12

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 465 inlägg
#13

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.

EnLitenDelfinMedlem sedan dec. 200421 inlägg
#14

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 465 inlägg
#15
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.

EnLitenDelfinMedlem sedan dec. 200421 inlägg
#16

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 058 inlägg
#17

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 2003130 inlägg
#18

Jag testade denna men det fungerade inte. Jag får felmeddelandet:
#1054 - Unknown column 'tbh.models' in 'having clause'

EnLitenDelfinMedlem sedan dec. 200421 inlägg
#19

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

EnLitenDelfinMedlem sedan dec. 200421 inlägg
#20

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

Genererad på 381 ms · cache AV · v20260730165559-full.f96bc7eb