Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在三个表之间合并数据_Php_Mysql_Sql - Fatal编程技术网

Php 在三个表之间合并数据

Php 在三个表之间合并数据,php,mysql,sql,Php,Mysql,Sql,我正在创建一个网站(供学校使用),在那里你可以从不同的公司购买东西。 在其中一个网站上,我想展示所有的公司,但只展示你选择的类别和城市中的公司 但我也希望它能按受欢迎程度排序。 每一次有人买东西,公司在所选类别和城市的知名度就会提高1 这些类别是:男子、妇女和家庭 为此,我使用了三个表: 表1-合作伙伴 | partner_id | name | type | logo | | id | partner_id | address | zipcode | cit

我正在创建一个网站(供学校使用),在那里你可以从不同的公司购买东西。 在其中一个网站上,我想展示所有的公司,但只展示你选择的类别和城市中的公司

但我也希望它能按受欢迎程度排序。 每一次有人买东西,公司在所选类别和城市的知名度就会提高1

这些类别是:男子、妇女和家庭

为此,我使用了三个表:

表1-合作伙伴

|  partner_id  |  name  |  type  |  logo  |
|  id  |  partner_id  |  address  |  zipcode  |  city  |
在第一个表中,我有公司名称、类型和徽标。 此表仅用于获取各公司的名称、类型和徽标


表2-单一合伙人

|  partner_id  |  name  |  type  |  logo  |
|  id  |  partner_id  |  address  |  zipcode  |  city  |
在第二张表中,我列出了全国所有的公司。 如果一家公司多次位于一个城市,则将有多行,但具有不同的id、地址、zipcode和城市。当然,合作伙伴id将是相同的


表3-合作伙伴的能力

|  id  |  partner_id  |  men  |  women  |  family  |
在第三个表中,每个公司的受欢迎程度将是。 在这里,来自每个城市的每家公司都将存储一个流行价值(男性、女性和家庭)。如果该公司在这三个类别中的任何一个都不受欢迎,它将不会被存储在表中

我可以展示每个城市的每家公司,但我无法根据类别按受欢迎程度进行排序


以下是我想要的一个快速示例:

在第一个站点上,您可以选择一个类别:男性、女性或家庭。 当您选择了一个类别后,您将通过键入邮政编码来选择一个城市

然后你将看到一个列表,其中将显示最受欢迎的公司,按你选择的类别和城市排序。如果一家公司在同一个城市存在多次,它应该只显示一个

如果您选择了男性和城市1,您将选择城市1男性类别中最受欢迎的公司

如果一家公司在该类别中没有任何人气价值,那么它将处于公司的最底层


我现在所能做的只是根据你选择的城市来展示这些公司,但我不能根据受欢迎程度对它们进行排序

这就是我尝试过的:

// Load partners
$load_partners = mysql_query("SELECT * FROM partners");
while($partners = mysql_fetch_array($load_partners)) {

    $partner_id = $partners['partner_id'];
    $partner_name = $partners['name'];
    $partner_logo = $partners['logo'];
    $partner_logo_dir = "media/partners/";

    $load_single_partners = mysql_query("SELECT DISTINCT '$partner_name' FROM single_partners WHERE partner_id='$partner_id' and postal='5000'");
    while($single_partners = mysql_fetch_array($load_single_partners)) {

        $single_partners_id = $single_partners['partner_id'];


            echo '<div class="partner" style="background: url('.$partner_logo_dir.$partner_logo.'); background-size: cover;" data-partner-id="'.$partner_id.'">'.$partner_name.'
        </div>'."\n";
        $order_partners = mysql_query("SELECT * FROM partner_popularity WHERE partner_id = '$single_partners_id'");
        while($order = mysql_fetch_array($order_partners)) {
        }
    }
}
//加载伙伴
$load_partners=mysql_查询(“从合作伙伴中选择*);
而($partners=mysql\u fetch\u数组($load\u partners)){
$partner_id=$partners['partner_id'];
$partners_name=$partners['name'];
$partners_logo=$partners['logo'];
$partner_logo_dir=“媒体/合作伙伴/”;
$load_single_partners=mysql_query(“从single_partners中选择不同的'$partner_name',其中partner_id='$partner_id'和postal='5000');
而($single_partners=mysql_fetch_array($load_single_partners)){
$single_partners_id=$single_partners['partner_id'];
回显“”。$partner\u name。“
“。”\n”;
$order\u partners=mysql\u query(“选择*FROM partner\u popularity,其中partner\u id='$single\u partners\u id');
而($order=mysql\u fetch\u数组($order\u partners)){
}
}
}
我想我应该以某种方式将三个表中的数据合并起来,但我不知道如何合并

还是我用三张不同的桌子做的都不对


希望您能通过以下问题理解:)

要实现这一点,您可以使用连接:

但是在这里,使用两个表来表示单个合作伙伴和受欢迎程度并不是真正需要的,因为一行单个合作伙伴严格等于一行合作伙伴受欢迎程度,您可以将它们放在同一个表中。您应该将它们放在同一个表中,如果合作伙伴没有注册受欢迎程度,则使用默认值零,这样在按受欢迎程度排序时,它将最后显示

那么,您将有两个表:

表1-合作伙伴

|  partner_id  |  name  |  type  |  logo  |
表2-单一合作伙伴

|  id  |  partner_id  |  address  |  zipcode  |  city  | pop_men | pop_women | pop_family
现在,选择所有项目的查询变得非常简单(只需选择合作伙伴,筛选城市,对其进行排序,即可完成),只需进行一点分组和加入,您还可以选择按所有城市人气汇总排序的合作伙伴:

SELECT p.*,
       SUM(pop_men) AS total_pop_men,
       SUM(pop_women) AS total_pop_women,
       SUM(pop_family) AS total_pop_family
FROM partners p
JOIN single_partners sp ON sp.partner_id = p.partner_id
GROUP BY partner_id
ORDER BY total_pop_men DESC,
         total_pop_women DESC,
         total_pop_family DESC
据我所知,这就是你想要的,或者类似的东西,我真的不明白它的全部含义,如果你选择这个,你将不得不做三个不同的,每个类别一个


如果我不帮忙,很抱歉。

有些事情我不明白,您曾经说过,如果没有代表,公司将不会被存储在表中,但是在您说希望他们位于列表底部之后,即使代表为0,也会更容易存储所有公司吗?我将开始设计一个“连接”选择来连接所有三个表。有合作伙伴和单一合作伙伴有什么意义?即使在同一个城市有两个不同的公司,你也希望它们看起来像一个!因为当你点击该公司时,会弹出一个框,你可以在该城市的多家公司中进行选择。而且我只有一个地方来定义公司的类型、名称和标志,这样同一家公司可以在不同的城市拥有不同的代表?是的。例如,如果我们在同一个城市有四家相同的公司,它们在每个类别中都有相同的代表。因此,上面的代码应该插入到我筛选城市的代码中?不,这只是此表重新排列范围的一个示例。您发布的代码已经可以做到这一点,您只需要在SELECT DISTINCT查询的末尾添加“ORDER BY”子句(与我使用的一样,但是使用了pop_*字段)。别忘了也要选择pop_*fields,否则你不会得到太多东西。我尝试将“select*FROM partners”更改为“select*SUM(pop_men)作为partners p中的total_pop_men”,并在select DISTINCT查询的末尾按total_pop_men DESC排序,但什么都没有发生。我做错了什么?你把一切都混在一起了。首先,尝试在两个查询之间使用生成的字段。那不行。然后