Php 在三个表之间合并数据
我正在创建一个网站(供学校使用),在那里你可以从不同的公司购买东西。 在其中一个网站上,我想展示所有的公司,但只展示你选择的类别和城市中的公司 但我也希望它能按受欢迎程度排序。 每一次有人买东西,公司在所选类别和城市的知名度就会提高1 这些类别是:男子、妇女和家庭 为此,我使用了三个表: 表1-合作伙伴Php 在三个表之间合并数据,php,mysql,sql,Php,Mysql,Sql,我正在创建一个网站(供学校使用),在那里你可以从不同的公司购买东西。 在其中一个网站上,我想展示所有的公司,但只展示你选择的类别和城市中的公司 但我也希望它能按受欢迎程度排序。 每一次有人买东西,公司在所选类别和城市的知名度就会提高1 这些类别是:男子、妇女和家庭 为此,我使用了三个表: 表1-合作伙伴 | partner_id | name | type | logo | | id | partner_id | address | zipcode | cit
| 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排序,但什么都没有发生。我做错了什么?你把一切都混在一起了。首先,尝试在两个查询之间使用生成的字段。那不行。然后