我需要使用MySQL和PHP创建一个查询来获得两个表的结果

时间:2012-04-03 20:43:35

标签: php mysql

我是MySQL和PHP的新手。我有两个表,一个用于保存所有公司名称,另一个表只有用户下面的公司名称:

Table 1
| # | Company name |
--------------------
| 1 | Microsoft    |
| 2 | HP           |
| 3 | Asus         |
| 4 | Apple        |
| 5 | Amazon       |
| 6 | CCN          |

table 2
| # | Company name | User name |
--------------------------------
| 1 | Asus         |   x1      |
| 2 | Apple        |   x1      |
| 3 | HP           |   x2      |
| 4 | Asus         |   x2      |
| 5 | Apple        |   x2      |

我需要创建一个实现以下功能的查询。首先显示的是与特定用户相关的公司(例如Asus和Apple用户x1)。之后,显示表1中的其余公司。

例如,我正在寻找的查询结果,对于用户X1,将以这种方式显示行:

| # | Company name |
--------------------
| 1 | Asus         |
| 2 | Apple        |
| 3 | Microsoft    |
| 4 | HP           |
| 5 | Amazon       |
| 6 | CCN          |

我怎样才能做到这一点?

5 个答案:

答案 0 :(得分:2)

您希望包含所有公司,但对于给定用户,首先列出与该用户关联的公司。如果是这种情况,您不想使用INNER JOIN

这是一些应该有效的SQL。我提供了合理的表和字段名称,因为你没有给出那些。我还假设你有一个合理的表格设计,没有重复的行。

SELECT c.company_name,

  CASE
    WHEN u.company_name IS NULL THEN 'N'
    ELSE 'Y'
  END AS user_has_company

FROM companies c

LEFT JOIN (
  SELECT *
  FROM users
  WHERE user_name = 'x1'
) u
ON u.company_name = c.company_name

ORDER BY user_has_company DESC, c.company_name

此查询将返回一个额外的列 - user_has_company。我用它来表示当前用户是否与给定公司相关联,但如果需要,可以忽略它。

答案 1 :(得分:0)

您需要一个JOIN语句来加入table1

的SELECT语句中的另一个语句

快速举例:

SELECT * FROM table2 INNER JOIN table1.id = table2.id WHERE table2.username ='x1'

您可以在JOIN文档中找到所需的一切。 http://dev.mysql.com/doc/refman/5.1/en/left-join-optimization.html

答案 2 :(得分:0)

像这样创建你的查询:

$sql = "SELECT b.companyName FROM table1 a INNER JOIN table2 b ON a.companyName = b.companyName WHERE b.userName = 'x1'";

然后,使用PHP,使用:

$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
    die('Could not connect: ' . mysql_error());
}

mysql_select_db("my_db", $con);

$result = mysql_query($sql);

while($row = mysql_fetch_array($result))
{
    echo $row['companyName'];
    echo "<br />";
}

mysql_close($con);

答案 3 :(得分:0)

尝试此查询:

SELECT company_name FROM table2 ORDER BY user_name ASC

HTML表格中,使用PHP代码:

$result = mysql_query(" SELECT company_name, user_name FROM table2 ORDER BY user_name ASC");
echo "<table>
      <tr><th>Company Name</th><th>username</th></tr>";
while($row = mysql_fetch_array($result) {
    echo "<tr><td>{$row['company_name']}</td><td>{$row['user_name']}</td></tr>";
}
echo "</table>"

答案 4 :(得分:0)

如果您刚刚在MySQL查询之后,那么这样的事情就可以了

SELECT company_name,SUM(IF(user_name='x1',1,0)) as ordering
FROM `table2`
GROUP BY company_name
ORDER BY ordering DESC

但是在你走得更远之前,你应该先看看你的架构。如果在一个表中有一个列(company_name)引用另一个表,则应该使该列引用另一个表的PRIMARY KEY,即

Table1

| # | company_name |
--------------------
| 1 | microsoft    |
| 2 | hp           |
| 3 | asus         |
| 4 | apple        |
| 5 | amazon       |
| 6 | CCN          |

table2
| # | company_id   | user_name |
--------------------------------
| 1 | 3            |   x1      |
| 2 | 4            |   x1      |
| 3 | 2            |   x2      |
| 4 | 3            |   x2      |
| 5 | 4            |   x2      |

这是您在数据库设计/规范化中学到的第一件事。在这种情况下,您需要更改查询。像这样:

SELECT company_name,SUM(IF(user_name='x1',1,0)) as ordering
FROM `table1`
    LEFT JOIN `table2` ON table2.company_id=table1.id
GROUP BY company_name
ORDER BY ordering DESC