-2

我是 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      |

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

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

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

我怎样才能做到这一点?

4

5 回答 5

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。我会用它来指示当前用户是否与给定公司相关联,但如果你愿意,你可以忽略它。

于 2012-04-03T20:50:34.363 回答
0

您将需要一个 JOIN 语句才能在 table1 的 SELECT-Statement 中加入另一个

快速示例:

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

于 2012-04-03T20:47:16.173 回答
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);
于 2012-04-03T20:49:24.923 回答
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>"
于 2012-04-04T15:35:02.177 回答
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
于 2012-04-04T15:39:01.813 回答