ugrás a tartalomhoz

több tábla

aspirany · 2008. Ápr. 16. (Sze), 10.11
Sziasztok!

Egy picit elakadtam.

Van 4 táblám.

1. cégadatok tartalmazza a cég adatait + a cég kategóriáját ID alapján
2. kategória tartalmazza a kategória nevét és a kategória ID-jét
3. termékek tartalmazza a termék nevét és a termék ID-jét
4. termektoceg kapcsoló tábla tartlamazza a termék ID-jet és a termékhez tartozó cég ID-jét
egy céghez több termék is tartozhat

pl termekID cegID
     1        1
     1        2
     2        1
     2        2


remélem ez az adatbázis felépítés nem hibás?!

Szeretnék egy lekérdezést ami visszaadja a cégadatokat + a cég kategória nevét és a termék nevére is lehessen szűrni

SELECT DISTINCT 
  (cegek.cegID) AS cegID,
  cegek.cegnev,
  kategoriak.kategorianev
FROM
  termektoceg
  LEFT JOIN cegek ON (termektoceg.cegID = cegek.cegID)
  INNER JOIN termekek ON (termektoceg.termekID = termekek.termekID)
  INNER JOIN kategoriak ON (cegek.kategoriaID = kategoriak.kategoriaID)
  WHERE
  termekek.nev LIKE "%"
de ez a lekérdezés hibás.
 
1

Hibás?

janoszen · 2008. Ápr. 16. (Sze), 10.57
Mi lenne, ha egy kicsit belegondolnál a válaszoló helyébe és egyrészt megadnád vagy még jobb - feltöltenéd a táblákat elkészítő SQL-edet, másrészt nem csak annyit mondanál apatikusan hogy a lekérdezés hibás, hanem azt is, hogy mi volt a hibaüzenet vagy jelenség?

Másrészt mi lenne, ha használnál kódkiemelőt? Akkor egyszerűbb lenne olvasni.

Egyébként mivel termékre keresel, én a másik oldalról indulnék el, nevezetesen a termékek felől, és onnan joinolnék.
2

elnézést

aspirany · 2008. Ápr. 16. (Sze), 11.07

CREATE TABLE `cegek` (
  `cegID` int(11) NOT NULL auto_increment,
  `cegnev` varchar(30) NOT NULL,
  `ceghely` varchar(30) NOT NULL,
  `cegkerulet` varchar(5) default NULL,
  `cegirsz` int(11) NOT NULL,
  `cegutca` varchar(40) NOT NULL,
  `ceghazszam` varchar(5) NOT NULL,
  `telefon` varchar(40) default NULL,
  `fax` varchar(20) default NULL,
  `email` varchar(30) default NULL,
  `url` varchar(30) default NULL,
  `kezdet` date default NULL,
  `ervenyesseg` date default NULL,
  `leiras` text,
  `kategoriaID` int(3) NOT NULL,
  PRIMARY KEY  (`cegID`),
  KEY `cegnev` (`cegnev`),
  KEY `ceghely` (`ceghely`),
  KEY `cegkerulet` (`cegkerulet`)
)

CREATE TABLE `kategoriak` (
  `kategoriaID` int(11) NOT NULL auto_increment,
  `kategorianev` varchar(20) NOT NULL,
  PRIMARY KEY  (`kategoriaID`)
)

CREATE TABLE `termekek` (
  `termekID` int(11) NOT NULL auto_increment,
  `nev` varchar(30) NOT NULL,
  PRIMARY KEY  (`termekID`)
)

CREATE TABLE `termektoceg` (
  `mainID` int(11) NOT NULL auto_increment,
  `cegID` int(11) NOT NULL,
  `nev` varchar(20) NOT NULL,
  PRIMARY KEY  (`mainID`),
  KEY `cegID` (`cegID`)
)
az szeretném ha a lekérdezésbe megjelennének azok a cégek amelyek tartalmazzák a keresett terméket

pl: zokni.

SELECT
  cegek.cegID,
  cegek.cegnev
FROM
  termektoceg
  RIGHT JOIN cegek ON (termektoceg.cegID = cegek.cegID)
  WHERE 
  termektoceg.nev LIKE '%'
Köszönöm a segítségedet

a hiba az volt a lekérdezésben hogy a termektoceg.nev LIKE '%' sort berakom nem tér vissza az összes céggel.
3

Logikai hiba

janoszen · 2008. Ápr. 16. (Sze), 11.38
Nyilván, akinek nincs rekordja a táblában, azt nem fogja kidobni. Egyébként még mindig hiányzik a kódszinező a hozzászólásodból, jó lenne ha használnád.

Naszóval, két kérdés:

- Van olyan termék, amelyiknek egynél több gyártója van?
- Ha nem, akkor minek kapcsolótábla?

Egyébként mint mondottam, én a termék felől indulnék el, mert nyilván az az érdekes. Ha nem ez az érdekes, akkor légy szíves magyarázd el, hogy mit szeretnél elérni a lekérdezéssel, mert szerintem, valami logikai bukfenc lesz.
4

lekér

aspirany · 2008. Ápr. 16. (Sze), 15.48
van olyan termék igen amihez több cég is tartozik.

a lekérdezésből azt szeretném visszakapni.

Azokat a cégeket amik gyártanak zoknit vagy cipőt

ha nem adok meg terméket akkor az összes gyártót adja vissza
5

Egész mondatok?

janoszen · 2008. Ápr. 16. (Sze), 20.37
Nem akarlak bántani, de a mondataidnak se eleje, se vége. Légyszi próbáld meg egy összeszedett mondatban elmondani, hogy mit szeretnél kapni, akkor megpróbálom neked elmondani, hogy mi lenne erre az általam gondolt helyes út.
6

tehát

aspirany · 2008. Ápr. 17. (Cs), 08.12
A lekérdezés adja vissza azokat a cégeket amelyek gyártják az adott terméket (amit a lekérdezésben beállítok pl:zokni), elég a cégID-t és a cég nevét visszatérnie.
De ha nem adok terméket, akkor térjen vissza az összes gyártóval.

Köszönöm a segítségedet.
7

Nem megy...

janoszen · 2008. Ápr. 17. (Cs), 19.33
Ez így, ilyen formában nem fog menni. Bármiféle képpen is állítod elő a joinokat, az egy táblázatot fog alkotni, amiből a where feltétellel tudsz keresni. Olyan két dimenziós táblázatot nem tudsz csinálni, amely meg tudja mondani minden termékről az ő gyártóit és egyben meg tudja mondani az összes gyártót úgy, hogy ne legyen benne egy gyártó többször. Ezt gondold végig. Innentől kezdve kénytelen vagy a lekérdezést alkalmazás-szinten szétválasztani. Nem is lenne gazdaságos ezt megcsinálni.

Én azt javasolnám (ha van 5-ös MySQL-ed), hogy készíts egy view-t, amelyben kiválasztod a termék-gyártó párosokat, pl így: (hasból írtam, szóval nem biztos, hogy jó)

CREATE VIEW
 termekgyartoi
 AS
  SELECT
   termek_gyarto.gyartok.id AS gyarto_id,
   gyartok.nev AS gyarto_nev,
   termek_gyarto.termek_id AS termek_id
  FROM
   termek_gyarto
   LEFT JOIN gyartok
    ON termek_gyarto.gyarto_id = gyartok.id
  ORDER BY termek_gyarto.termek_id;
Ha ezt létrehoztad, akkor meg tudod nézni, mi van benne és ki tudod válogatni egy termék gyártóit a következő képpen:

SELECT gyarto_id, gyarto_nev FROM termekgyartoi WHERE termek_id='12';
Ha pedig a gyártókat akarod megkapni: (habár leválogathatnád distinct-tel is, de így sokkal gazdaságosabb)

SELECT gyartok.id AS gyarto_id, gyartok.nev AS gyarto_nev FROM gyartok;
Még valami: SQL-ben természetesen tudsz if-else és egyéb gyönyöröket csinálni, de minél egyszerűbb, annál gyorsabb általában a lekérdezés, arról nem is beszélve, hogy könnyebb karban tartani. Szóval szerintem, ez a járható út. Ha feltétlenül SQL-ben szeretnéd az elágazást elkövetni, akkor ajánlom figyelmedbe a tárolt eljárásokat (ezek használata azonban nem triviális, mert az alkalmazásodnak tudnia kell result setet ugrani, különben a kapcsolat elveszti a szinkront és lehal).
8

köszönöm

aspirany · 2008. Ápr. 18. (P), 08.13
Köszönöm a segítségedet hasonló megállapításra jutottam, két lekérdezésből oldom meg.

ez ha nincs termékre keresés:

SELECT DISTINCT(cegek.cegID),
cegek.cegnev,
cegek.ceghely,
cegek.cegkerulet,
cegek.cegirsz,
cegek.cegutca,
cegek.ceghazszam,
cegek.telefon,
cegek.fax,
cegek.email,
cegek.url,
cegek.ervenyesseg,
cegek.kezdet,
cegek.leiras,
cegek.kategoriaID,
kategoriak.kategorianev
FROM
kategoriak INNER JOIN cegek ON (kategoriak.kategoriaID = cegek.kategoriaID)
LEFT JOIN termektoceg ON (cegek.cegID = termektoceg.cegID)
WHERE cegnev LIKE '$cegnev%' AND ceghely LIKE '$varos%' AND cegek.kezdet <= now() AND cegek.ervenyesseg >= now()";

+ kegészül a lekérdezés ezzel ha keresek terméket.

AND termektoceg.nev LIKE '$termeknev%'";

köszönöm a kitartó segítségedet.
9

Escape + no egybegyógyulás

janoszen · 2008. Ápr. 18. (P), 12.33
Off: Mindig és minden fórumtémában elmondom, hogy változókat NEM szabad csak úgy közvetlenül betolni SQL lekérdezésbe. Tessék escapelni, különben egy rossz bemenet vagy még rosszabb, egy rosszindulatú felhasználó hazavághatja az egész adatbázisodat.

On: A másik, hogy itt belejöttek olyan táblák és adatok, amikről az előző leírásodban nem említettél semmit. Javaslom, hogy gyárts view-kat (nézeteket), mert ez nagyban megkönnyíti a tervezést, ha csak egyszerű táblákból kell kiválogatni.

Ha jól nézem, itt fölöslegesen joinolsz a termektoceg táblával, ha nincs ermék, csak akkor kell, ha használod is. Mint mondottam, ne próbáld meg egy lekérdezésből megcsinálni. Oldd meg teljesen külön lekérdezésekkel. Az ilyen egybegyógyulások mindig csak szíváshoz vezetnek.