Hogyan tudom megoldani ezt az SQL JOIN problémát?
Az a lényeg, hogy vannak fent áruk egy táblában, és az ahhoz tartozó képek egy másik táblában. A képek connect_id-ja megegyezik a megfelelő áru id-jával. Nyilván utóbbi auto incrementes integer érték.
Az a lényeg, hogy amikor listába kiírom az adatokat egy while ciklussal, úgy kéne joinolnom, hogy a termék adatai csak egyszer íródjanak ki, utána közben a többi iterációval pedig az összes kép.
Tehát mondjuk ár, méret, leírás egyszer, aztán nyolc kép
aztán
ár méret leírás, aztán hét kép (nyilván amennyi tartozik a termékhez.)
Eddig erre jutottam:
"SELECT DISTINCT images.link AS imagelink, properties.* FROM properties INNER JOIN images ON images.connect_id = properties.id"
Lefut maga a kód, de így annyiszor írja ki az egyedi termékekhez tartozó adatot, ahány darab kép tartozik a termékhez, tehát a DISTINCT nem segít a dolgon.
A link a kép, megvan az oka, hogy nem image vagy picture lett a neve, de ez tökmindegy.
Valami tipp?
INNER JOIN egy külön legyen...
SELECT
images.link AS imagelink,
properties.*
FROM properties
INNER JOIN
(SELECT link, connect_id FROM images LIMIT 1 ) AS images
ON images.connect_id = properties.id ;
Vagy GROUP BY...
SELECT
images.link AS imagelink,
properties.*
FROM properties
INNER JOIN images
ON images.connect_id = properties.id
GROUP BY properties.id ;
Annyi hogy ha INNER akkor csak akkor ír ki terméket ha van hozzá kép.
Ha vannak olyan termékek ahol nincsenek képek, ott inkább LEFT JOIN kell.
Sírok.
Az megvan, hogy a group by mire való, és hogy ezek a kódok le se futnak?
Ja, hogy a MySQL ilyen idiótán működik. :D :D :D
Normális adatbáziskezelőben az ilyen nem megengedett (MySQL-ben is kikapcsolható).
Egyébként ez nem oldja meg semmilyen formában a kérdező problémáját, mert ezzel csak elrejted a képeket, úgyhogy újabb EPIC FAIL a részedről.
Még mindig csak azt tudom írni, amit már többször írtam én is, meg más is.
Vagy külön kérdezd le a képeket, vagy ne agyatlanul "pakold a listába" a lekérdezés eredményét.
Egyébként itt legtöbbször azt érzem mintha óvodásokkal vitatkoznék.
Idejöttök valami baromsággal, aminek semmi köze a problémához (mint itt a GROUP BY), aztán kardoskodtok, de márpedig az igenis jó.
Ja, MySQL-ben igen, csak abszolút nem segít senkin.
Tehát kb tényleg megeheted a saját fikádat, csak attól még nem laksz jól.
CREATE TEMPORARY TABLE `tempimages` (
`connect_id` char(10) NOT NULL,
`link0` varchar(255) NULL,
`link1` varchar(255) NULL,
`link2` varchar(255) NULL,
`link3` varchar(255) NULL,
`link4` varchar(255) NULL,
`link5` varchar(255) NULL,
`link6` varchar(255) NULL,
`link7` varchar(255) NULL,
PRIMARY KEY (`connect_id`)
);
INSERT INTO `tempimages` (`connect_id`)
SELECT `images`.`connect_id`
FROM `images`
GROUP BY `images`.`connect_id`
;
UPDATE `tempimages`
SET
`link0` = (
SELECT `link`
FROM `images`
WHERE (`images`.`connect_id` = `tempimages`.`connect_id`)
LIMIT 0, 1
),
`link1` = (
SELECT `link`
FROM `images`
WHERE (`images`.`connect_id` = `tempimages`.`connect_id`)
LIMIT 1, 1
),
`link2` = (
SELECT `link`
FROM `images`
WHERE (`images`.`connect_id` = `tempimages`.`connect_id`)
LIMIT 2, 1
),
`link3` = (
SELECT `link`
FROM `images`
WHERE (`images`.`connect_id` = `tempimages`.`connect_id`)
LIMIT 3, 1
),
`link4` = (
SELECT `link`
FROM `images`
WHERE (`images`.`connect_id` = `tempimages`.`connect_id`)
LIMIT 4, 1
),
`link5` = (
SELECT `link`
FROM `images`
WHERE (`images`.`connect_id` = `tempimages`.`connect_id`)
LIMIT 5, 1
),
`link6` = (
SELECT `link`
FROM `images`
WHERE (`images`.`connect_id` = `tempimages`.`connect_id`)
LIMIT 6, 1
),
`link7` = (
SELECT `link`
FROM `images`
WHERE (`images`.`connect_id` = `tempimages`.`connect_id`)
LIMIT 7, 1
);
SELECT `properties`.*, `tempimages`.*
FROM `properties`
INNER JOIN `tempimages` ON `tempimages`.`connect_id` = `properties`.`id`
;
Ez itt weblapkészítés kategória, ahol az esetek 90% -ban PHP - MySQL -t használnak.
Ahol a GROUP BY bár nem szép de célravezető.
"Ez itt weblapkészítés kategória, ahol az esetek 90% -ban PHP - MySQL -t használnak."
Azért ez elég nagy bullshit. Inkább csak azt mutatja, hogy elég alacsony a színvonal.
"Ahol a GROUP BY bár nem szép de célravezető."
Még egyszer kérdezem, hogyan segít azon, hogy az adatokat csak egyszer, de az összes képet kiírja a GROUP BY, ami elrejti a többi képet.
Aki erre nem tud válaszolni, de a GROUP BY-t javasolja, az legyen kedves tarkón b#szni magát.
Ezt így nem fogod tudni megcsinálni. Ha szükséged van 1 lekéréssel az összes képre és a hozzátartozó leírásra, ahol egy leíráshoz több kép is tartozik, akkor úgy csinálod, ahogy elkezdted. Lekéred az összekötött táblát:
termék1 - kép1
termék1 - kép2
termék1 - kép3
termék2 - kép4
termék2 - kép5
termék3 - kép6
Valóban, a termék többször szerepel, de azzal nem adatbázis oldalon kell stresszelned, hanem a szerver oldali nyelvvel, mikor végig iterálsz a rekordokon, eldöntöd, hogy most új, vagy régi termékhez tartoznak-e az adatok. Ez egy egyszerű feltétel vizsgálat egy változóval, például az utolsó termék id-t vizsgálod mindig. Ha észlelted, hogy új termék következik, akkor foglalkozol vele, egyébként csak a képpel, és így elérheted ezt a kiírási formát:
termék1
kép1
kép2
kép3
termék2
kép4
kép5
termék3
kép6
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!