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

我需要使用MySQL和PHP创建一个查询,以获得两个表的结果,php,mysql,Php,Mysql,我是MySQL和PHP新手。我有两个表,一个表包含所有公司名称,另一个表仅包含用户下方的公司名称: Table 1 | # | Company name | -------------------- | 1 | Microsoft | | 2 | HP | | 3 | Asus | | 4 | Apple | | 5 | Amazon | | 6 | CCN | table 2 | # | Company n

我是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和苹果的用户x1)。之后,将显示表1中剩余的公司

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

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

如何实现这一点?

在表1的SELECT语句中,您需要一个JOIN语句来连接另一个语句

快速示例:

选择*FROM table2 internal JOIN table1.id=table2.id,其中table2.username='x1'

您将在连接文档中找到所需的一切。

创建如下查询:

$sql = "SELECT b.companyName FROM table1 a INNER JOIN table2 b ON a.companyName = b.companyName WHERE b.userName = 'x1'";
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
然后,使用,使用:

$con=mysql\u connect(“localhost”、“peter”、“abc123”);
如果(!$con)
{
die('无法连接:'.mysql_error());
}
mysql_select_db(“my_db”,$con);
$result=mysql\u查询($sql);
while($row=mysql\u fetch\u数组($result))
{
echo$row['companyName'];
回声“
”; } mysql_close($con);
看起来您希望包括所有公司,但对于给定用户,请首先列出与该用户关联的公司。如果是这种情况,则不希望使用
内部联接

这里有一些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
此查询将返回一个额外的列-
用户拥有公司
。我会用它来表示当前用户是否与给定的公司关联,但如果您愿意,可以忽略它。

尝试以下查询:

SELECT company_name FROM table2 ORDER BY user_name ASC
在表中,使用代码:

$result=mysql\u查询(“按用户名ASC从表2中选择公司名称、用户名”);
回声“
公司名称用户名”;
while($row=mysql\u fetch\u数组($result){
echo“{$row['company_name']}{$row['user_name']}”;
}
回声“”

如果您刚刚完成了MySQL查询,那么类似的东西就可以工作了

SELECT company_name,SUM(IF(user_name='x1',1,0)) as ordering
FROM `table2`
GROUP BY company_name
ORDER BY ordering DESC
但在进一步研究之前,您应该先查看您的模式。如果一个表中有一列(公司名称)引用了另一个表,则应该使该列引用另一个表的主键,即

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      |
这是您在数据库设计/规范化过程中首先学到的内容之一。在这种情况下,您需要更改查询。类似以下内容:

$sql = "SELECT b.companyName FROM table1 a INNER JOIN table2 b ON a.companyName = b.companyName WHERE b.userName = 'x1'";
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

表2应该使用表1中的公司id,而不是重复的名称。我无法理解这个问题。@jordanm我仍在努力解决这个问题。@BenCarey-这是我的第一个想法,但如果你看一下他的预期输出,他不仅仅是在连接关系。所以你想以与表1相同的顺序获得表1的内容,but表2中使用的用户x的条目您希望显示在结果的顶部…我说的对吗?虽然这看起来像是一个正常的解决方案,但它不会根据显示的输入生成他预期的输出。这只是一个简单的示例,不是他的完美解决方案,您只能通过编程伙伴来学习编程。您好,先生,我仍然是对代码有一些误解,你能再次帮助我吗?谢谢我的第一个表调用表1有一个字段调用公司名称第二个表调用表2有两个字段调用公司名称和用户名,所以我知道了用户和公司的来源我需要创建它们吗?用户是一个新表再次感谢你真的应该重命名你的表吗如果您重命名
table1->companys
table2->users
,那么我的查询将按原样进行。请检查这是否是我编写代码的方式选择table1.company_name,SUM(if(table2.user_name='x1',1,0))从
table2
LEFT JOIN
table1
ON table2.company\u id=table1.id按table1.id分组。company\u name按ordering DESC排序,但它只显示commun行,而不是表中的所有行请帮助again@tony我的错,表的顺序错误。请尝试表1左键连接表2