Vra

Dit is baie soortgelyk aan Beperk resultate van by tafel een ry, nie , maar ek sukkel om dit te kry om te werk presies soos wat ek nodig het...

Die tafel struktuur is baie soortgelyk:

CREATE TABLE tblProducts (
    intProductID int(11) NULL AUTO_INCREMENT,
    strProductName varchar(255) NULL,
    PRIMARY KEY (intProductID)
);

CREATE TABLE tblProductImages (
    intImageID int(11) NULL AUTO_INCREMENT,
    intProductID int(11) NULL,
    strImageName varchar(255) NULL,
    intOrder int(11) NULL,
    PRIMARY KEY (intImageID)
);

Vul die tafels met:

INSERT INTO tblProducts (strProductName)
VALUES
('Product #1'), ('Product #2'), ('Product #3');

INSERT INTO tblProductImages (intProductID, strImageName, intOrder) 
VALUES
(1, 'image_for_1.jpg', 1), 
(2, '1st_image_for_2.jpg', 1), 
(2, '2nd_image_for_2.jpg', 2);

Ek wil'n om te doen KIES wat terug al 3 produkte, met toepaslike beelde.Soortgelyk aan:

intProductID, strProductName, strImageName
1, Product #1, image_for_1.jpg
2, Product #2, 1st_image_for_2.jpg
3, Product #3, NULL

'n eenvoudige oplossing sou wees:

SELECT intProductID, strProductName, 
 (SELECT strImageName
  FROM tblProductImages
  WHERE tblProductImages.intProductID = tblProducts.intProductID
  ORDER BY intOrder
  LIMIT 1)
FROM tblProducts

Maar hierdie versuim as ek wil om by te voeg & terugkeer ander gebied van die tblProductImages (AltText vir voorbeeld)

Ek het die opstel van'n Peuter op http://sqlfiddle.com/#!2/883c5/1

Dankie

Was dit nuttig?

Oplossing

Hierdie een sal werk, maar is baie lelik

select p.intProductId, p.strProductName, pi.strImageName 
from tblProducts p
inner join tblProductImages pi on pi.intProductID = p.intProductId
inner JOIN (select min(intOrder) minOrder, intProductID
           FROM tblProductImages
           GROUP BY intProductID) s
           on s.intProductID = p.intProductID and s.minOrder = pi.intOrder
union
select p.intProductId, p.strProductName, pi.strImageName
from tblProducts p
left join tblProductImages pi on pi.intProductID = p.intProductId
where pi.intProductID is null;

alternatief:

select p.intProductId, p.strProductName, pi.strImageName
from tblProducts p
left join tblProductImages pi on pi.intProductID = p.intProductId
where pi.intProductId is null or pi.IntOrder = (select min(intOrder)
                                                from tblProductImages
                                                where intProductId = pi.intProductId);

Sqlfiddle

Ander wenke

Wat jy nodig het om te gebruik samevoeging (spesifiek GROUP BY).Jy wil GROUP BY die produk se naam en die gebruik van'n LEFT JOIN sodat die beeld nie nodig het om te bestaan.

SELECT strProductName, strImageName
FROM tblProducts LEFT JOIN tblProductImages USING (intProductID)
GROUP BY strProductName

Let daarop dat die beeld wat gekies in hierdie geval is ewekansige (maar gewoonlik sal dit wees in intImageID volgorde).Dit word aanvaar dat die werklike beeld opgespoor is nie belangrik nie so lank as wat dit is wat verband hou met die gegewe produk.

http://sqlfiddle.com/#!2/1391e6/1

Vir die presiese uitset, moet u moontlik u insetselverklaring vir tabel TBLProductImages verander as:

INSERT INTO tblProductImages (intProductID, strImageName, intOrder) VALUES
    (1, 'image_for_1.jpg', 1), (2, '1st_image_for_2.jpg', 1), (3, '2nd_image_for_3.jpg', 2);

En gebruik die onderstaande SELECT -stelling:

SELECT tP.intProductID, tp.strProductName, tPI.strImageName
FROM tblProducts AS tP 
INNER JOIN tblProductImages AS tPI ON tP.intProductID = tPI.intProductID;
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top