-2

私はMySQLとPHPが初めてです。私は 2 つのテーブルを持っています。1 つはすべての会社名を保持し、もう 1 つはユーザーの下に会社名のみを保持するテーブルです。

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      |

以下を実現するクエリを作成する必要があります。最初に、特定のユーザーに関連付けられている企業が表示されます (ユーザー x1 の場合、Asus と Apple など)。その後、表 1 の残りの企業が表示されます。

たとえば、私が探しているクエリの結果、ユーザー X1 は次のように行を表示します。

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

どうすればこれを達成できますか?

4

5 に答える 5

2

すべての会社を含めたいようですが、特定のユーザーについては、そのユーザーに関連付けられている会社を最初にリストします。その場合は、. を使用したくありませんINNER JOIN

動作するはずの 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

このクエリは追加の列を返します - user_has_company. これを使用して、現在のユーザーが特定の会社に関連付けられているかどうかを示しますが、必要に応じて無視できます。

于 2012-04-03T20:50:34.363 に答える
0

このクエリを試してください:

SELECT company_name FROM table2 ORDER BY user_name ASC

HTMLテーブルで、PHPコードを使用します。

$result = mysql_query(" SELECT company_name, user_name FROM table2 ORDER BY user_name ASC");
echo "<table>
      <tr><th>Company Name</th><th>username</th></tr>";
while($row = mysql_fetch_array($result) {
    echo "<tr><td>{$row['company_name']}</td><td>{$row['user_name']}</td></tr>";
}
echo "</table>"
于 2012-04-04T15:35:02.177 に答える
0

このためのMySQLクエリの直後にいる場合、このようなものが機能します

SELECT company_name,SUM(IF(user_name='x1',1,0)) as ordering
FROM `table2`
GROUP BY company_name
ORDER BY ordering DESC

ただし、さらに先に進む前に、スキーマを確認する必要があります。あるテーブルに別のテーブルを参照する列 (company_name) がある場合、その列が他のテーブルの PRIMARY KEY を参照するようにする必要があります。

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      |

これは、データベースの設計/正規化で最初に学ぶことの 1 つです。この場合、クエリを変更する必要があります。このようなもの:

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
于 2012-04-04T15:39:01.813 に答える
0

table1 の SELECT ステートメントで別のステートメントを結合するには、JOIN ステートメントが必要です。

簡単な例:

SELECT * FROM table2 INNER JOIN table1.id = table2.id WHERE table2.username = 'x1'

必要なものはすべて JOIN のドキュメントに記載されています。 http://dev.mysql.com/doc/refman/5.1/en/left-join-optimization.html

于 2012-04-03T20:47:16.173 に答える
0

次のようにクエリを作成します。

$sql = "SELECT b.companyName FROM table1 a INNER JOIN table2 b ON a.companyName = b.companyName WHERE b.userName = 'x1'";

次に、PHPを使用して、次を使用します。

$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
    die('Could not connect: ' . mysql_error());
}

mysql_select_db("my_db", $con);

$result = mysql_query($sql);

while($row = mysql_fetch_array($result))
{
    echo $row['companyName'];
    echo "<br />";
}

mysql_close($con);
于 2012-04-03T20:49:24.923 に答える