我是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 |
我怎样才能做到这一点?
答案 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
$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