Avatar billede Slettet bruger
14. februar 2012 - 22:22 Der er 6 kommentarer og
1 løsning

Join og order

Hej

Jeg vil gerne JOINE 2 tabeller og have ORDER BY kategori.
Men for hver kategori der findes, skal tabel_1 have prioritet:


SQL = "SELECT headline, kategori FROM tabel_1 where dbdata like '%"&q&"%' ORDER BY kategori

SQL = "SELECT headline, kategori FROM tabel_2 where dbdata like '%"&q&"%' ORDER BY kategori


Mit output kan fx se sådan ud:

AAAAAAAAAAAAAAA <-- kategori 1
    aaaaaaaaaaa <-- headline data fra tabel_1
    bbbbbbbbbbb <-- headline data fra tabel_1
    ccccccccccc <-- headline data fra tabel_1
    aaaaaaaaaaa <-- headline data fra tabel_2
    bbbbbbbbbbb <-- headline data fra tabel_2
    ccccccccccc <-- headline data fra tabel_2

BBBBBBBBBBBBBBB <-- kategori 2
    aaaaaaaaaaa <-- headline data fra tabel_1
    aaaaaaaaaaa <-- headline data fra tabel_2
    bbbbbbbbbbb <-- headline data fra tabel_2
    ccccccccccc <-- headline data fra tabel_2

CCCCCCCCCCCCCCC <-- kategori 3
    aaaaaaaaaaa <-- headline data fra tabel_1
    bbbbbbbbbbb <-- headline data fra tabel_1
    ccccccccccc <-- headline data fra tabel_1
    aaaaaaaaaaa <-- headline data fra tabel_2


OSV

Nogle som kan hjælpe ? :-)
Avatar billede tobrukDk Novice
14. februar 2012 - 22:55 #1
Avatar billede Slettet bruger
14. februar 2012 - 23:23 #2
Som jeg forstår det returnerer den kun hvis der er mindst et match i begge tabeller - det skal der nødvendigvis ikke være i mit setup ;)

mit output er baseret på kategorier fra begge tabeller outputtes alfabetisk - og når tilfældet er at der er match fra begge tabeller, skal tabel_1 prioriteres over tabel_2 i ORDER BY. - også alfabetisk.

Fx hvis der i kategorien CYKEL bliver fundet 3 poster i tabel_1 og 2 poster i tabel_2, og tilsvarende i CYKELSTATIVER skal outputtet være:

CYKEL
1) a cykel fra tabel_1
2) b cykel fra tabel_1
3) c cykel fra tabel_1
- - - - - - - - - - -
4) a cykel fra tabel_2
5) b cykel fra tabel_2


CYKELSTATIV
1) a cykelstativ fra tabel_1
2) b cykelstativ fra tabel_1
3) c cykelstativ fra tabel_1
- - - - - - - - - - - - - -
4) a cykelstativ fra tabel_2
5) b cykelstativ fra tabel_2

osv.
15. februar 2012 - 06:35 #3
Det falder mig svært at følge dig.  Fra de queries du viser i dit oprindelige spørgsmål ser det ud til, at tabellerne har (mindst) tre kolonner, headline, kategori, og dbdata, og det er i dbdata du søger efter ord der inderholder for eksempel cykel.  Men i #2 ser det ud til, at det er i kolonnen kategori du søger efter ord like cykel.  Jeg går i det følgende ud fra, at dine queries skulle have været noget med

SELECT headline, kategori FROM tabel_1 WHERE kategori LIKE '%cykel%'

Så går jeg ud fra, at i outputtet i #2 a, b, og c er headlines og cykel og cykelstativ er kategorier.

Hvis jeg har forstået alt det nogenlunde korrekt, så skal du føje tabellerne sammen med UNION snarere end med JOIN.  Hvis du så i outputtet vil kunne se hvilken tabeller rækkerne kommer fra, så må tabellerne have en kolonne der identificerer tabellen.

Jeg prøvede for test at lave disse to tabeller med de følgende værdier

CREATE TABLE diktator1(tabel VARCHAR(20), head VARCHAR(10), kategori VARCHAR(20));
CREATE TABLE diktator2(tabel VARCHAR(20), head VARCHAR(10), kategori VARCHAR(20));
 
INSERT INTO diktator1 VALUES('fra tabel 1', 'a', 'cykel');
INSERT INTO diktator1 VALUES('fra tabel 1', 'b', 'cykel');
INSERT INTO diktator1 VALUES('fra tabel 1', 'c', 'budcykel');
INSERT INTO diktator1 VALUES('fra tabel 1', 'd', 'cykelstativ');
INSERT INTO diktator1 VALUES('fra tabel 1', 'e', 'knallert');
INSERT INTO diktator2 VALUES('fra tabel 2', 'f', 'cykel');
INSERT INTO diktator2 VALUES('fra tabel 2', 'g', 'budcykel');
INSERT INTO diktator2 VALUES('fra tabel 2', 'h', 'budcykel');
INSERT INTO diktator2 VALUES('fra tabel 2', 'i', 'bil');
INSERT INTO diktator2 VALUES('fra tabel 2', 'j', 'cykelstativ');

Så kørte jeg denne query:

SELECT id, headline, kategori, tab FROM diktator1 WHERE kategori LIKE '%cykel%'
UNION
SELECT id, headline, kategori, tab FROM diktator2 WHERE kategori LIKE '%cykel%'
ORDER BY kategori, tab;

og jeg fik dette output.  Er det hvad du er ude efter?


head kategori        tabel
c      budcykel      fra tabel 1
h      budcykel      fra tabel 2
g      budcykel      fra tabel 2
b      cykel            fra tabel 1
a      cykel            fra tabel 1
f      cykel            fra tabel 2
d      cykelstativ  fra tabel 1
j      cykelstativ  fra tabel 2
15. februar 2012 - 06:37 #4
Men du synes at have to tabeller med identisk struktur.  Hvis det er tilfældet, hvorfor placerer du så ikke det hele i en enkelt tabel?  Det ville synes at være simplere.  Eller er det mig der ikke har forstået det_
Avatar billede Slettet bruger
15. februar 2012 - 09:20 #5
Hej Christian

Det ligner det jeg er ude efter til forveksling ;o)
Men jeg forstår ikke din ORDER BY kategori, tab;
hvad er 'tab'..?


Ja, jeg har 2 næsten identiske tabeller. Den ene med statisk data, og den anden med dynamisk data - jeg vil gerne holde dem adskilt. Jeg vil gerne i søgeresulterne have det dynamiske indhold vist først. Dvs hvis man søger på 'cykel' får man som du også har sat op, og hvor tabel_1 repræsenterer det dynamsike content som 1. prioritet i hver kategori.

Vh, Michael
15. februar 2012 - 09:25 #6
Nej, det skulle have været tabel.  I den test jeg stillede op kaldte jeg den kolonne tab fordi jeg var doven.  Du vil have resultaterne ordnet først efter categori, altså alle CYCEL før CYCELSTATIV, men hvis der er flere CYCEL skal de fra tabel 1 komme først.  For at kunne ordne per tabel må hver række indholde tabellens navn.
Avatar billede Slettet bruger
15. februar 2012 - 09:37 #7
Jeg fik det løst - tak for det :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester