2009-01-29 240 views
0

我有一个名为PROJECT_CATEGORY表,它包含两个字段要使用哪种类型的连接?

CAT_ID和cat_title

我存储在另一个表称为项目,使该CAT_ID:

project_category.cat_id = projects.cat_id 

什么是使用MySQL的最好方式运行查询以显示cat_title。换句话说,我想显示的名称不是表的ID号。将这项工作:

SELECT * FROM projects INNER JOIN projects ON project_category.cat_id = projects.cat_id 

然后调用它:

'.$row['cat_title'].' 

有什么想法?

回答

1

如果项目有一个有效的cat_id和cat_id是唯一的,比INNER JOIN是好的。

如果任何项目有一个NULL cat_id,则需要一个LEFT JOIN。

如果cat_id不是唯一字段(主键),您可能希望使用子查询将自己限制为每个项目的一个结果。

+0

是...每个项目都会拥有某种类型的分类。 – Coughlin 2009-01-29 22:31:58

0
SELECT 
    projects.cat_id cat_id 
FROM 
    projects INNER JOIN 
    project_category ON project_category.cat_id = projects.cat_id 
0
SELECT cat_title 
FROM projects 
    INNER JOIN project_category ON project_category.cat_id = projects.cat_id 

这应该工作。

+0

为了显示cat_title,我可以使用: '。$ row ['cat_title']。' 我试过并得到一个空白输出,没有错误 – Coughlin 2009-01-29 22:34:03

+0

在像phpMyAdmin这样的查询分析器中运行查询,看看你是否得到任何结果。如果没有,你可能没有任何数据出于某种原因,否则你可能会错误地在php中读取字段。 – 2009-01-30 01:00:53

1

尽量不要使用SELECT *,而应选择您需要的特定字段。另外,如果您在查询中使用多个表,请将它们别名,以便根据需要提取值,而不会遇到歧义问题。

不管怎么说,你可以尝试这样的:

SELECT  
project_category.cat_title 
,projects.* 
FROM 
projects 
    LEFT OUTER JOIN  
    project_category 
    ON project_category.cat_id = projects.cat_id 
0

你的加入看起来不错。 FWIW,在这种情况下,我会使用USING条款。它的工作原理是相同的,但它是一个有点更清晰简洁:

SELECT * FROM projects INNER JOIN project_category USING (cat_id); 

如果您无法在您的$row关联数组找到列,我会检查你列定义的拼写,包括大小写。如果你申报表是这样的:

CREATE TABLE `Project_Category` (
    `Cat_ID` INTEGER NOT NULL, 
    `Cat_Title` VARCHAR(20) NOT NULL 
); 

那么结果集可以使用数组键是文字的拼写和大小写。 PHP数组键区分大小写。

print $row['Cat_Title']; 

你或许应该转储$row阵列,看看它认为它的关键是:

print_r($row); 
0

您可以使用NATURAL JOIN

SELECT CAT_TITLE 
FROM projects 
NATURAL JOIN project_category 

如果colunms是同一类型和不是null,不需要将字段放在连接中,它会正常工作。