使用哪种类型的联接?

时间:2009-01-29 22:27:24

标签: mysql

我有一个名为PROJECT_CATEGORY的表,它包含两个字段

cat_id和cat_title

我将cat_id存储在另一个名为PROJECTS的表中:

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'].'

有什么想法吗?

6 个答案:

答案 0 :(得分:1)

如果每个项目都有一个有效的cat_id且cat_id是唯一的,那么INNER JOIN就可以了。

如果任何项目的cat_id为NULL,则需要LEFT JOIN。

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

答案 1 :(得分:1)

尽量不要使用SELECT *,而是选择您需要的特定字段。此外,如果在查询中使用多个表,请对它们进行正确别名,以便您可以根据需要提取值,而不会遇到模糊问题。

无论如何,你可以尝试类似的东西:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

这应该有效。

答案 4 :(得分: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);

答案 5 :(得分:0)

您可以使用NATURAL JOIN

SELECT CAT_TITLE
FROM projects
NATURAL JOIN project_category

如果列是相同的类型而不是null,则不需要将字段放在连接中,它将正常工作。