webForumDet fria alternativet

två blir ett ?

21 svar · 1 174 visningar · startad av Mr T

Mr TMedlem sedan maj 20071 061 inlägg
#1

Har 2 tabeller för att skapa "virtuellt filsystem"

Förenklat ser dessa ut på följande sätt :
Map
************
id
parent_map_id
namn
************

Fil
************
id
parent_map_id
namn
************

Jag vill nu skapa en lista där jag bara vill visa X antal / sida. Det sätt jag tänkt mig är med hjälp av "limit".
För att det ska funka behöver jag lägga samman tabellerna. Jag vill att mapparna visas fösta och filer sedan.

Kommer i tanken såhär långt, men inte längre :

SELECT
map.id, map.parent_map_id, map.namn,
(skapa en "mapp" parrameter)
fil.id, fil.parent_map_id, fil.namn
FROM
map, fil
WHERE
map.parent_map_id = aktuell_map_id
AND
map.parent_map_id = aktuell_map_id
ORDER BY
(mappar ska visas först)
LIMIT 0, 25

Peter SMedlem sedan dec. 20025 483 inlägg
#2
select id
     , <aktuellt-mapp-id>
     , namn
     , 'mapp' as typ
  from map
 where parent_map_id = <aktuellt-mapp-id>
 union all
select id
     , <aktuellt-mapp-id>
     , namn
     , 'fil' as typ
  from fil
 where parent_map_id = <aktuellt-mapp-id>
order
    by case when typ = 'mapp' then 1 else 2 end
     , namn
 limit 0,25
Mr TMedlem sedan maj 20071 061 inlägg
#3

Har ännu inte hunnit prova fullt ut men jobbar på det. (All tid bara försvinner. "Alla dessa dagar som kom och gick, inte visste jag att det var livet")

Mr TMedlem sedan maj 20071 061 inlägg
#4

(Äntligen lite tid över...)

Varför ska jag ha ett id nummer i efter id ? Menar du "parent_map_id" ?

Inser att jag i "filer" kallar "name" för "content". Men borde väll gå att skriva "name as content" ?

Peter SMedlem sedan dec. 20025 483 inlägg
#5

Jag tog bara med alla fält i tabellerna; det går utmärkt att ta bort id från select-listorna :)

Japp, namn kan du byta mot content.

Mr TMedlem sedan maj 20071 061 inlägg
#6

Får det inte att funka alls. Mycket beroende på att jag inte helt är med på vad som "beordras" i SQL frågan.

För att förenkla det lite för min över-kokta hjärna så skriver skriver jag in att fil namn heter "content" och att databaserna (tabellerna) heter "_db" efter.

Map_db
************
id
parent_map_id
namn
************

Fil
************
id
parent_map_id
content
************

Tacksam för kommentarer till SQL förfrågan så jag själv vet vad jag har och på så sätt kan fel söka.

Peter SMedlem sedan dec. 20025 483 inlägg
#7
select id
     , namn as content
     , 'mapp' as typ
  from map_db
 where parent_map_id = <aktuellt-mapp-id>
 union all
select id
     , content
     , 'fil' as typ
  from fil_db
 where parent_map_id = <aktuellt-mapp-id>
order
    by case when typ = 'mapp' then 1 else 2 end
     , namn
 limit 0,25

Den första delen, ovanför "union all", hämtar alla mappar som ligger i mappen med id = <aktuellt-mapp-id>. Den andra delen, under "union all", hämtar alla filer i mappen med id = <aktuellt-mapp-id>. "Union all" slår samman resultaten till en lista, typ:

1 mapp1 mapp
2 mapp2 mapp
3 mapp3 mapp
1 fil1 fil
2 fil2 fil
3 fil3 fil

Mr TMedlem sedan maj 20071 061 inlägg
#8

Bra, då vet ja att jag tänkte rätt. Så långt kom jag också. Dock blev jag osäker då det ändå inte funkade ändå, men det är bra att jag nu vet att jag tänker rätt. Ska klura lite till får vi se.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#9

Ang. lagring av trädstrukturer i databaser råkade jag snubbla över denna presentation:
Bloginlägg: http://www.alberton.info/talks_dpc_2009_wrapup.html
Tillhörande slideshow: http://www.slideshare.net/quipo/trees-in-the-database-advanced-data-structures?type=presentation

Mr TMedlem sedan maj 20071 061 inlägg
#10

Lite för avacnerade grejer för mitt lilla projekt. Intresant dock att se hur mycket SQL kan användas till då man själv bara sniffar lätt på ytan och knappt det.

Mr TMedlem sedan maj 20071 061 inlägg
#11

Äntligen fick jag det att börja funka. Vet inte vad jag har gjort för skillnader innan, men nu börjar det funka i alla flal.

tack !

Mr TMedlem sedan maj 20071 061 inlägg
#12

...ropa hej innan osv..... :-(

Upptäcker 2 grejer som inte alls funkar.

I Map är namn "varchar(255)" och i Fil, som inte har namn utan istället content, är det en "text". När jag tar "content as name" blir det bara "1" i "name" för filerna :-(

Inser att raden "case when typ='mapp' then 1 else 2 end" inte funkar (hade tagit bort den och därför blivit glad när det äntligen hoppade igång). Kan det vara versionen av MySQL ? Spelar ingen roll då jag kan bara köra en "ORDER BY typ" så funkar det ändå.

Mr TMedlem sedan maj 20071 061 inlägg
#13

Vänder på det!

Map
namn varchar(255)

Fil
content text

istället för "content as name" i Fil gör jag "name as content" i Map ( och naturligtvis "ORDER BY content").

Tyvärr är "1" det enda som finns i Fil "content".

Why !?!?!??!

Mr TMedlem sedan maj 20071 061 inlägg
#14

Jag blir inte klok på detta !

(Skickar här med SQL frågan rakt av och hoppas att ni förstår tabell uppbyggnaden)

Denna ger "281" ur name när det är "fil", men helt okej på "mapp":

SELECT id, name, container_id, 'mapp' as typ FROM fw_container WHERE container_id=[I]281[/I] UNION ALL
SELECT id, container_id, [B]content as name[/B], 'fil' as typ from fw_content WHERE container_id=[I]281[/I]
ORDER BY typ DESC, name limit 0,25

Denna funkar inte alls:

SELECT id, name, container_id, 'mapp' as typ FROM fw_container WHERE container_id=[I]281[/I] UNION ALL
SELECT id, container_id, [B]content[/B], 'fil' as typ from fw_content WHERE container_id=[I]281[/I]
ORDER BY typ DESC, name, [B]content[/B] limit 0,25

Tacksam för hjälp.

@ndersMedlem sedan juni 200032 969 inlägg
#15

Du får ett resultatset - du kan ju inte ha olika fältnamn på dina två select-satser i din union.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#16

Snanders spikar sanningen. Jag gissar att det du vill göra är typ detta:

SELECT id, name, container_id, null as content, 'mapp' as typ FROM fw_container WHERE container_id=281 UNION ALL
SELECT id, name, container_id, content, 'fil' as typ from fw_content WHERE container_id=281
ORDER BY typ DESC, name, content limit 0,25

Har för övrigt filerna inget eget namn?

Mr TMedlem sedan maj 20071 061 inlägg
#17

Ska genast prova denna nya SQL förfrågan.

Ang. namn i filer : När jag skapade tabellen ansåg jag att filerna inte behövde namn, men jag har insett att det nu vore bra, men då jag har ca 1000 poster nu vet jag inte om jag har ett bra sätt att fylla namnfältet automatiskt på.
Kan man ta första raden i fältet content och automatsikt lägga in i fältet namn automatiskt ?

Mr TMedlem sedan maj 20071 061 inlägg
#18

SUPER !!! med en liten "null as name" i fil frågan (tills jag får till ett namn fält med något i) så funkar det nu super !

Ett jätte tack för hjälpen!

Nu är bara frågan hur man tar fram första raden (X antal tecken tills return) ur contetn och får den till fältet namn. Några ideer ?

@ndersMedlem sedan juni 200032 969 inlägg
#19

borde väl gå typ så här:

update fw_content set name = left(content, instr('\n'))

Gör en select på detsamma först så du ser om det blir rätt.

Mr TMedlem sedan maj 20071 061 inlägg
#20

@nders skrev:

borde väl gå typ så här:

update fw_content set name = left(content, instr('\n'))

Gör en select på detsamma först så du ser om det blir rätt.

En mindre justering så funkade det perfeckt ! Stor tack !

update `fw_content` set name = left(content, instr(content,'\n')) WHERE 1
135 ms totalt · 3 externa anrop · v20260731065814-full.102f7fcd
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)