2011-10-19 143 views
0

我有2个表(mysql),一个用于产品名称和其他产品图像。SQL查询加入两个表

tblproducts - >编号(INT,PK),名称(VARCHAR)

tblphotos ---> ID(INT,PK),产品ID(INT,FK),照片,为了

in tblphotos订单字段是照片的显示顺序(1,2,3 ...)

每个产品可以有超过1张照片。我所需要的产品的第一张照片(顺序= 1)

我需要的是tblproducts.id,tblproducts.name,tblphotos.photo(照片必须是一个与顺序1)

我写下面的查询,但我的产品名称是重复

SELECT tblproducts.id,tblproducts.name, tblphotos.photo 
    FROM tblproducts 
LEFT JOIN tblphotos on tblphotos.productid = tblproducts.id 

一件事::我要以升序排序

+1

您忘记使用where子句?即; 'tblphotos.order = 1' – Prasanth

回答

-1

我认为这会为你

SELECT tblproducts.id, tblproducts.name, tblphotos.photo 
FROM tblproducts 
LEFT JOIN tblphotos on tblphotos.productid = tblproducts.id 
    and tblphotos.order=1; 
01的工作秩序
+1

我相信''和'必须和'where'一起。 '和'只适用于'tblphotos'。这意味着来自'tblproducts'的所有**行将仍然存在,并且如果由于'end'而在'tblphotos'中丢失了一个匹配项,则将被空值替换。 – Melsi

+0

@Melsi:是的,我认为你是对的,所有来自tblproducts的数据都会被结果...我们也可以用JOIN替换LEFT JOIN,那么它应该是正确的。 –

3

如果你只是想的第一张照片(其中带有顺序= 1),那么你需要指定在查询:

SELECT 
    PR.id AS product_id, 
    PR.name, 
    PH.photo 
FROM 
    Products PR 
LEFT OUTER JOIN Photos PH ON 
    PH.product_id = PR.id AND 
    PH.`order` = 1 

由于order可能是一个保留字,我一直在封闭它MySQL的默认引用标识符。尽管如此,你会更好地使用不同的列名称。另外,我不能让自己在表名前写上一个带有“tbl”的查询。

+0

@JohnK,必须同意TomH,你应该远离你的列名中的保留字 - 它只会导致你的问题,也没有必要用tbl前缀表名。仍然在标准点上,表名通常应该是单数,即产品和照片而不是复数,但这只是一个小问题。 –

+0

+1。 @JohnK:'SortOrder'是Order的一个很好的选择。另一个是“排序”。 –

0

试试这个:

SELECT tblproducts.id,tblproducts.name, tblphotos.photo 
FROM tblproducts LEFT JOIN tblphotos on tblphotos.productid = tblproducts.id 
and tblphotos.order=1