/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Select fra flere tabeller
Fra : Jesper Rasmussen


Dato : 02-10-02 11:04

Hej

Jeg skal lave en søgefunktion, der søger i flere tabeller, der ikke har
nogen relationer til hinanden.
Databasen er MySQL.

Jeg forsøgte med

SELECT * FROM tabel_01, tabel_02 WHERE navn LIKE '%x%'

Det løser bare ikke helt mit problem, da jeg her får data fra begge tabeller
i hvert resultat.

Jeg ønsker at kunne søge på Navn i tabel_01 og Produkt i tabel_02.

Er det muligt?
Har jeg forklaret det godt nok?

Mvh
Jesper




 
 
Jens Gyldenkærne Cla~ (02-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 02-10-02 11:23

Jesper Rasmussen skrev:

> Jeg skal lave en søgefunktion, der søger i flere tabeller, der
> ikke har nogen relationer til hinanden.

Det er sjældent nødvendigt - hvad skal du bruge søgningen til?


> SELECT * FROM tabel_01, tabel_02 WHERE navn LIKE '%x%'

Det er et CROSS JOIN (selvom operatoren ikke angives) som vil
returnere krydsproduktet af de to tabeller, filtreret på feltet
navn (som kun må optræde i én af tabellerne).

> Det løser bare ikke helt mit problem, da jeg her får data fra
> begge tabeller i hvert resultat.

Skal du have to resultater? I så fald skal du bare bruge to
forespørgsler (der evt. kan fyres af sammen):

SELECT * FROM tbl1 WHERE navn LIKE '%x%'; SELECT * FROM tbl2 WHERE
produkt LIKE '%x%';


> Jeg ønsker at kunne søge på Navn i tabel_01 og Produkt i
> tabel_02.

Hvis du vil have ét postsæt med poster fra tabel_01 og tabel_02
[1] kan du bruge en UNION-forespørgsel:

SELECT id, navn FROM tabel_01 WHERE navn LIKE '%x%'
UNION
SELECT produktID, navn FROM tabel_02 WHERE produkt LIKE '%x%'

Du skal være opmærksom på at det kun virker når alle
forespørgslerne (der kan være flere end to) har samme antal felter,
og felttyperne passer sammen (felt1 i første forespørgsel skal have
samme datatype som felt1 i de andre og så fremdeles).
Feltnavnene i den færdige forespørgsel bestemmes alene af den
første forespørgsel - og et eventuelt sorteringskriterium skal
sættes ind _efter_ den sidste SELECT.

Noter:
======
[1] Hvis det er rigtige tabelnavne vil jeg anbefale dig at bruge mere
beskrivende navne i fremtiden. Det er langt lettere at overskue en
database hvis tabel- og felt-navne afslører lidt om hvad de
indeholder.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Jesper Rasmussen (02-10-2002)
Kommentar
Fra : Jesper Rasmussen


Dato : 02-10-02 12:02

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote in message
news:Xns929B7E0B94D51jcdmfdk@127.0.0.1...
> Jesper Rasmussen skrev:
>
> > Jeg skal lave en søgefunktion, der søger i flere tabeller, der
> > ikke har nogen relationer til hinanden.
>
> Det er sjældent nødvendigt - hvad skal du bruge søgningen til?

Blot en søgefunktion på en hjemmeside, der kan søge i både News-tabellen og
Forum-tabellen.

Den skal returnere ID på rækken i den givne tabel så jeg kan vide siden.
Kolonnen ID findes i begge tabeller.

> Skal du have to resultater? I så fald skal du bare bruge to
> forespørgsler (der evt. kan fyres af sammen):
>
> SELECT * FROM tbl1 WHERE navn LIKE '%x%'; SELECT * FROM tbl2 WHERE
> produkt LIKE '%x%';

HMM når jeg kører min forespørgsel baseret på ovenstående returneres ingen
rækker.
Køres hver enkelt forespørgsel separat returneres rækker.

Det er måske i virkeligheden slet ikke muligt at gøre som jeg vil.
Det var også mere for at undgå at lave en masse programmering, hvis jeg
kunne klare det hele i SQL'en.

Men jeg kan godt se nu, at da jeg skal hive ID ud fra dem begge, at det
ville være svært at adskille om ID kom fra tabel_01 eller tabel_02.


Tak for svaret i øvrigt.
Det var ganske værdifuldt.

> [1] Hvis det er rigtige tabelnavne vil jeg anbefale dig at bruge mere
> beskrivende navne i fremtiden. Det er langt lettere at overskue en
> database hvis tabel- og felt-navne afslører lidt om hvad de
> indeholder.

De har deskriptive navne.
Det er blot for at folk ikke låser sig fast i noget, hvis jeg angiver de
rigtige navne.

Mvh
Jesper



Jens Gyldenkærne Cla~ (02-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 02-10-02 12:28

Jesper Rasmussen skrev:

> Den skal returnere ID på rækken i den givne tabel så jeg kan
> vide siden. Kolonnen ID findes i begge tabeller.

Forslag:

SELECT id, navn, 'shownews.asp' as visfil FROM tblNews WHERE navn
LIKE '%x%'

UNION

SELECT id, 'showforum.asp' FROM tblNews WHERE produkt LIKE '%x%'

Så kan du lave et link sådan her:

<a href="<%= rs("visfil") %>?id=<%= rs("id") %>"><%= rs("navn")
%></a>

(Hvis du arbejder i PHP kender du sikkert selv en lignende metode
der).


> HMM når jeg kører min forespørgsel baseret på ovenstående
> returneres ingen rækker.

Det er ikke sikkert at dit scriptsprog eller din database forstår
at levere flere recordset.
Men det kan også gøres simplere. Først sender du den første select
afsted - itererer den igennem og viser de returnerede poster -
bagefter åbner du en ny select og fortsætter med resultaterne
herfra. Alt efter smag og behag kan de placeres på én lang liste
eller i to adskilte. Blot kan du ikke få dem blandet indbyrdes (fx
sorteret efter navn) på denne måde.


> Men jeg kan godt se nu, at da jeg skal hive ID ud fra dem
> begge, at det ville være svært at adskille om ID kom fra
> tabel_01 eller tabel_02.

Det kan du gøre ved at lave dit eget felt i de to selects (se
eksemplet ovenfor).


>> [1] Hvis det er rigtige tabelnavne vil jeg anbefale dig at
>> bruge mere beskrivende navne i fremtiden.

> De har deskriptive navne.
> Det er blot for at folk ikke låser sig fast i noget, hvis jeg
> angiver de rigtige navne.

Det tror jeg ikke du skal være bange for. Tværtimod kan de rigtige
navne mange gange hjælpe til med at afsløre hvad en spørger i
virkeligheden vil.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Jesper Rasmussen (02-10-2002)
Kommentar
Fra : Jesper Rasmussen


Dato : 02-10-02 14:16

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote in message
news:Xns929B890461279jcdmfdk@127.0.0.1...
> Jesper Rasmussen skrev:
>
> > Den skal returnere ID på rækken i den givne tabel så jeg kan
> > vide siden. Kolonnen ID findes i begge tabeller.
>
> Forslag:
>
> SELECT id, navn, 'shownews.asp' as visfil FROM tblNews WHERE navn
> LIKE '%x%'
>
> UNION
>
> SELECT id, 'showforum.asp' FROM tblNews WHERE produkt LIKE '%x%'
>
> Så kan du lave et link sådan her:
>
> <a href="<%= rs("visfil") %>?id=<%= rs("id") %>"><%= rs("navn")
> %></a>

OK - det var sq smart!
Problemet er så bare, at UNION ikke virker i MySQL 3.23 men først fra MySQL
4.0

Jeg tror at jeg vil gå efter din anden tilgangsvinkel ved at lave to kørsler
af koden - Først henter vi det ene og skriver ud og dernæst den anden.

Tak for ideerne,
Jesper




Rune B (03-10-2002)
Kommentar
Fra : Rune B


Dato : 03-10-02 16:42


"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote in message
news:Xns929B890461279jcdmfdk@127.0.0.1...
> Jesper Rasmussen skrev:
>
> > Den skal returnere ID på rækken i den givne tabel så jeg kan
> > vide siden. Kolonnen ID findes i begge tabeller.
>
> Forslag:
>
> SELECT id, navn, 'shownews.asp' as visfil FROM tblNews WHERE navn
> LIKE '%x%'
>
> UNION
>
> SELECT id, 'showforum.asp' FROM tblNews WHERE produkt LIKE '%x%'
>
> Så kan du lave et link sådan her:
>
> <a href="<%= rs("visfil") %>?id=<%= rs("id") %>"><%= rs("navn")
> %></a>


Eller tage skridtet helt ud:

SELECT '<a href="enfil.asp?id=' + id + '>' + navn + '</a>' AS as minURL FROM
tabel_01 WHERE ....
UNION ALL

SELECT '<a href="enandenfil.asp?id=' + id + '>' + navn + '</a>' AS as minURL
FROM tabel_02 WHERE ....
UNION ALL

SELECT osv...

Smid evt. en CAST eller CONVERT på "id"

Rune







Jens Gyldenkærne Cla~ (02-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 02-10-02 14:19

Jesper Rasmussen skrev:

> Problemet er så bare, at UNION ikke virker i MySQL 3.23 men
> først fra MySQL 4.0

O.k. - det vidste jeg ikke.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Jesper Rasmussen (02-10-2002)
Kommentar
Fra : Jesper Rasmussen


Dato : 02-10-02 16:51

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote in message
news:Xns929B9BCD8B22jcdmfdk@127.0.0.1...
> Jesper Rasmussen skrev:
>
> > Problemet er så bare, at UNION ikke virker i MySQL 3.23 men
> > først fra MySQL 4.0
>
> O.k. - det vidste jeg ikke.

Jeg sidder og sover.
Jeg tester på en MySQL 3.23, men der, hvor scriptet rent faktisk skal køres
anvender de MSSQL.

Jeg har ikke testet endnu, men virker aliaserne "'shownews.asp' AS visfil"
også på MSSQL?
Jeg ved UNION gør, men mener at have læst at aliaser er en MySQL-ting?

Mvh
Jesper



Jens Gyldenkærne Cla~ (02-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 02-10-02 17:04

Jesper Rasmussen skrev:

> Jeg tester på en MySQL 3.23, men der, hvor scriptet rent
> faktisk skal køres anvender de MSSQL.

Det lyder upraktisk. Der er mange ting der ikke virker begge steder
(men det mest basale SQL gør selvfølgelig).

> Jeg har ikke testet endnu, men virker aliaserne
> "'shownews.asp' AS visfil" også på MSSQL?

Ja. Alias virker både i Access og MSSQL (det er vist også en SQL92-
standard)l

> Jeg ved UNION gør, men mener at have læst at aliaser er en
> MySQL-ting?

PS: Du kan roligt regne med at de løsninger jeg foreslår vil virke
[1] i MSSQL - mit kendskab til andre databasesystemer (Access undtaget)
er ret minimalt.

Noter:
======
[1] ...hvis de altså overhovedet virker. Ikke alle mine eksempler er
afprøvet i praksis før de havner på usenet.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste