组合三个表之间的数据

时间:2014-05-13 08:26:31

标签: php mysql sql

我正在创建一个网站(用于学校用途),您可以在这里购买来自不同公司的内容。 在其中一个网站上,我想展示所有公司,但只展示您所选择的类别和城市中的公司。

但我也希望它按人气排序。 每当一个人购买东西时,公司在所选类别和城市中的受欢迎程度将提高1。

类别包括:男性,女性和家庭。

为此,我使用了三张桌子:

表1 - 合作伙伴

|  partner_id  |  name  |  type  |  logo  |

在第一张表中,我有公司名称,类型和徽标。 此表仅用于获取每个公司的名称,类型和徽标。


表2 - single_partners

|  id  |  partner_id  |  address  |  zipcode  |  city  |

在第二个表格中,我拥有全国所有公司。 如果一个compay在一个城市中多次定位,则会有多行,但具有不同的ID,地址,邮政编码和城市。 partner_id当然也是一样的。


表3 - partner_pupolarity

|  id  |  partner_id  |  men  |  women  |  family  |

在第三张表中,每家公司的受欢迎程度将是。 在这里,每个城市的每个公司都将存储人气价值(男人,女人和家人)。如果公司在这三个类别中没有任何一个,那么它就不会存储在表格中。

我可以向每个城市展示每家公司,但我不能根据类别对其进行排序。


Heres是我想要的一个简单例子:

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

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

如果您选择了男士和城市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)) {
        }
    }
}

我想我应该以某种方式结合三张桌子的数据,但我不知道如何。

..或者我使用三个不同的表做错了吗?

希望你能通过问题理解:)

2 个答案:

答案 0 :(得分:1)

您可以做的是使用联接:Here is some MySQL doc about this

但是,在这里,不需要使用2个表用于单个合作伙伴和流行度,因为一行single_partners严格等于partner_popularty的一行,您可以将它们放在同一个表中。您应该将它们放在同一个表中,如果合作伙伴没有注册人气,则使用默认值为零,因此在按人气排序时会显示最后一个。

那么,那么你将有2个表:

表1 - 合作伙伴

|  partner_id  |  name  |  type  |  logo  |

表2 - single_partners

|  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

答案 1 :(得分:0)

SELECT partners.name FROM partners, single_partners, partner_popularity
WHERE single_partners.name = 'cityname' AND partners.id = single_partners.partner_id AND
partners.id = partner_populariry.partner_id ORDER BY partner_popularity.[category]

据我所知,这就是你要找的东西,或类似的东西,我真的不明白它的全部含义,这个选择你必须做三个不同的,每个类别一个。

对不起,如果我没有帮助。