Avatar billede nomisweb Nybegynder
14. november 2007 - 04:29 Der er 13 kommentarer og
1 løsning

Hvordan henter jeg data fra en tabel på baggrund af en anden tbl?

Hej,
Jeg har en lille indkøbskurv og har lidt problemer med hvordan jeg henter det rigtige datasæt.
Jeg har mine kategorier og produkter i hver sin tabel, med en kategori ID som fremmed nøgle i min produkter tabel. Nu er det sådan at jg kun vil hente de kategorier hvor produkterne i disse kategorier har flere end et produkt på lager. Men hvordan er det lige jeg gør det?
Følgende virker, men så mangler jeg den nok vigtigste data fra kategori tabellen, nemlig primær nøglen cat_id:

SELECT cat_parent_id, cat_name, cat_image, cat_description, pd_qty
FROM tbl_category c, tbl_product p
WHERE p.cat_id = c.cat_id AND p.pd_qty >= '1'
ORDER BY cat_name

Når den er med får jeg følgende fejlmeddelse:
#1052 - Column 'cat_id' in field list is ambiguous

Nogen gode forslag til hvordan jeg får cat_id med?

tak for hjælpen,
S
Avatar billede arne_v Ekspert
14. november 2007 - 04:36 #1
angiv den som c.cat_id eller p.cat_id
Avatar billede arne_v Ekspert
14. november 2007 - 04:36 #2
databasen tager ikke hensyn til at de er ens
Avatar billede nomisweb Nybegynder
14. november 2007 - 14:57 #3
Det virkede! Fedt, nogle gange er jeg facineret over at de leste problemer er så simpl at løse!
Tak for hjælpen, smider du et svar!
S
Avatar billede arne_v Ekspert
14. november 2007 - 16:48 #4
svar
Avatar billede nomisweb Nybegynder
14. november 2007 - 17:04 #5
Jeg opdager lige at  phpmyadmin virkede det fint, men der er noget der går galt i min php. Ved du om den hiver kollonne navnet c.cat_id eller cat_id ind?Det virker som om dete r der problemet er nemlig?!
Avatar billede arne_v Ekspert
14. november 2007 - 17:11 #6
c.cat_id as c_cat_id

og hent c_cat_id i PHP
Avatar billede nomisweb Nybegynder
14. november 2007 - 17:18 #7
Det må du undskylde men jeg forstår ikke dit svar. Jeg har brug for cat_id men det virker som om den hiver c.cat_id ind (dvs. med et c. først), selv om i phpmyadmin den viser den rigtige kolonne.
Avatar billede arne_v Ekspert
14. november 2007 - 17:41 #8
select ..., c.cat_id as c_cat_id, ...

og saa henter du i PHP kolonnen c_cat_id
Avatar billede nomisweb Nybegynder
14. november 2007 - 18:01 #9
ahhhh ok så forstår jeg det! Tak.

jeg har desværre fundet ud af en anden fejl... hvis jeg kun henter ting fra kategorier får jeg 37 output rækker, sætter jeg så krøllen ind med at den kun skal tage de kategorier hvor der er produkter i kommer den frem med 75 output rækker. Det skulle jo egentlig have blevet mindre. Hvordan kan det være og kan det fikses?

Dvs. jeg har brug for at få en kategori vist hvis der er en lagerbeholdning på en eller flere i hver af de produkter som findes i kategorien! Er der bare et produkt som har 1 stk skal kategorien vises!

Gir det mening?

Nuværende SQL ser altså således ud:
SELECT c.cat_id AS cat_id, cat_parent_id, cat_name, cat_image, cat_description, pd_qty
FROM tbl_category c, tbl_product p
WHERE p.cat_id = c.cat_id AND p.pd_qty >= '1'
ORDER BY cat_id, cat_parent_id
Avatar billede arne_v Ekspert
15. november 2007 - 02:07 #10
i.s.f. en række per kategori får du nu en række per produkt
Avatar billede arne_v Ekspert
15. november 2007 - 02:10 #11
Vil du have de kategorier som har mindst et produkt med mere end 1 på lager eller vil
du have de kategorier hvor produkterne tilsammen har mere end 1 på lager.

Det første lyder mest rimeligt.

Prøv:

SELECT cat_id,cat_parent_id,cat_name,cat_image,cat_description
FROM tbl_category
WHERE cat_id IN (SELECT cat_id FROM tbl_product WHERE pd_qty > 1)
Avatar billede nomisweb Nybegynder
15. november 2007 - 16:20 #12
Nå men havde skrevet et svar i nat til det her, men det er væk, var ellers sikker på jeg så det tilføjet...men det er nu ikke første gang det er sket. jeg prøver igen!

Du havde helt ret i at det var den måde jeg skulle bruge sætningen. Super smart at man bare kan sætte den der nye SELECT ind! Så det ser rigtigt ud, eller dvs.  (jeg tør næsten ikke sige det) men jeg kunne nu se at der er noget andet der så mangler. Undskyld.

Jeg har sat det sådan op at man har "over" og under kategorier, og med den sætning som du har foreslået kommer alle kategorier frem der indeholde produkter med mere end en på lager, desværre kommer overkategorierne ikke med. Jeg har nemlig i min php sagt at der ikke må være produkter i overkategorierne. Så det jeg har brug for at tilføje er at over kategorier skal tages med hvis underkategorien er med.
Jeg har eksempelvis en overkategori med cat_id 32 (med cat_parent_id = 0), og 2 under kategorier med cat_id 35 og 43 (deres cat_parent_id er så 32). Kan det lade sig gøre?

Jeg har prøvet at sætter "OR cat_parent_id = 0" og lave en UNION men begge resulterede i at jeg fik alle overkategorier ligemeget om der var noget i underkategorierne eller ej.

Tusind tak for din hjælp, det er fedt at lære mere om Mysql.
S
Avatar billede arne_v Ekspert
16. november 2007 - 02:16 #13
Desværre er Oracle den eneste database der har en god håndtering af parent-child
i tabeller.

Man kan lave en stored procedure i MySQL 5+ til det, men det er besværligt.

Lav query som ovenfor. Smid alle cat_id i et array.

Lav en query:
  SELECT parent_id FROM tbl_category WHERE cat_id IN (liste med id'er)

Hvis der er nogen rækker så smide de nye id'er ind i array og hop op til forrige.

Saml alle
Avatar billede nomisweb Nybegynder
18. november 2007 - 18:47 #14
Ok det prøver jeg. Tak for al din hjælp. Det var super! :-)
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