1

我对 php 和 mysql 很陌生。我正在努力学习,并被困在这个问题上。

我有一个多对多的关系。这些表是:用户和状态。用户表中的许多公司在许多州运营,每个州都有许多不同的公司。user 表上的每个公司都有一个唯一的 id,它存储在 state 表中。然后,状态表有一个列表示公司运营所在的州名称。在状态表中为公司所在的每个州创建一个新行。这一切似乎都正常。

我编写了以下 php 代码,从任何给定状态($state)的状态表中提取所有公司 ID,然后显示在给定状态下运行的所有公司名称(从带有公司 ID 的用户表中提取)。

我的问题是我想按字母顺序排列在任何给定州运营的公司的列表。此代码不会这样做。谁能提供一种更好的方法来执行此操作,以允许对列表进行排序(或者通常会更有效和更好)?

$state=$_GET['state'];
echo $state;
$aid=array();
$result=mysql_query("SELECT * FROM state WHERE state='$state'");
while($row=mysql_fetch_assoc($result)){
$v=$row['company_id'];
array_push($aid,$v);};

foreach($aid as $val){
$result1=mysql_query("SELECT * FROM users WHERE company_id='$val'");
$row1=mysql_fetch_assoc($result1);
$company=$row1['company'];
echo $company.'<br/>';};

表结构为:

用户

company_id
company
(other columns that are not relevant)

状态

index
company_id
state
(no additional columns)
4

3 回答 3

2

您通常会在关系数据库中引入第三个表来表达多对多关系。该表可以是 users_states,并且只有字段:user_id 和 state_id。所以你的表应该看起来像这样:

您在 SQL 中进行排序。因此查询可能如下所示:

SELECT u.*, s.*
FROM users AS u
INNER JOIN users_states AS us ON u.user_id = us.user_id
INNER JOIN states AS s ON us.state_id = s.state_id
WHERE s.state_id = ?
ORDER BY u.name ASC

在这里,我假设一个字段name是您想要排序的字段,并且您将过滤为 state_id 传递的某些值。

于 2012-09-06T19:23:14.743 回答
1

请参阅此网址:-

多对多关系选择和排序

大概是这样的:

SELECT
    a.person_id
FROM
    table AS a,
    table AS b
WHERE
    a.person_id = b.person_id AND
    a.favorite_id = 1 AND
    b.favorite_id = 2
ORDER BY
    ( IF( a.is_main_favorite = "y", 1, 0 )
      +
      IF( b.is_main_favorite = "y", 1, 0 ) ) DESC

顺便说一句:您可能希望在数据库中存储 1/0 而不是 y/n,这样您就不需要 IF 调用

于 2012-09-06T19:15:30.920 回答
0

试试这个 SQL 语句:

SELECT 
    s.state, u.company 
FROM 
    states s, users u 
WHERE 
    s.company_id = u.company_id 
AND 
    s.state = "$state" 
GROUP BY 
    s.state 
ORDER BY 
    s.state, u.company

这应该为您提供每个所选州的公司按字母顺序排列的列表。ORDER BY 首先使用状态,以防您决定扩展查询以获得多个状态。

于 2012-09-06T19:20:32.480 回答