1

これはマルチパートの質問です。私のデータベースは次のようになります。

USERS
-id
-fname
-lname

COMPANIES
-id
-name
-type

PRODUCTS
-id
-product
-restaurant (foreign key to companies id)
-vendor (foreign key to companies id)
-user (foreign key to users id)
-transaction_date
  1. これはデータベースをセットアップする良い方法ですか? レストランとベンダー用に別々のテーブルを用意することを考えていましたが、同じログイン ページを使用し、UNION クエリを気にする必要はなく、タイプ別に選択するだけでした。ログイン時に異なる情報が表示されるため、if type = r, show this else show that という if ステートメントがあります。最良の方法?

2 番目の問題は、ログイン時に情報を表示したいときに発生します。ベンダーがログインすると、ベンダー ID に一致するすべてのレコードのリストが表示されます。ただし、ネストされたループが原因で、表示されるレコードが多すぎます。たとえば、テーブルは次のようになります。

Date--Product--Restaurant--User

私はこのクエリを使用しています:

$sql = mysql_query("SELECT products.*, companies.name, CONCAT_WS(' ', users.fname, users.lname) AS fullname FROM products INNER JOIN companies ON products.vendor = companies.id INNER JOIN users ON products.user = users.id WHERE company='$id' AND companies.type='$type'") or die(mysql_error());

$num=mysql_num_rows($sql);

$sql1 = mysql_query("SELECT products.restaurant, companies.name AS cname FROM products INNER JOIN companies ON products.restaurant = companies.id") or die(mysql_error());

$num1=mysql_num_rows($sql1);

$i = 0;
while ($i < $num) {
  $j = 0;
  while ($j < $num) {
$d = mysql_result($sql,$i,"transaction_date");
$p = mysql_result($sql,$i,"product");
$r = mysql_result($sql1,$j,"cname");
$u = mysql_result($sql,$i,"fullname");

<td><?php echo $d; ?></td>
<td><?php echo $p; ?></td>
<td><?php echo $r; ?></td>
<td><?php echo $u; ?></td>

$j++; }
$i++; }

$idログイン時に$typeセッションによって作成された値です。現在、テーブルには 4 つのサンプル レコードがあります。$numとの値$num1が両方とも 4 であり、4 回$numループしているため、4 だけを表示するのではなく、16 を表示します。$num1

  1. この問題を解決して 4 つのレコードだけを表示するにはどうすればよいですか?

ご協力ありがとうございました。いずれかの部分で説明が必要な場合はお知らせください。

4

1 に答える 1

1

データベースの設定を少し考え直す必要があるかもしれません。

これは、各ユーザーがどの会社に属しているかを知る必要があり、製品テーブル内にこれを含めることができないためだと思います。

そのようにユーザーテーブルに外部キーを追加することを検討します(1人のユーザーに1つの会社があり、1つの会社に多くのユーザーがいると仮定します)。私はまた、以下のようないくつかの他の提案をしました:

ユーザー - id - company_id - first_name - last_name

会社 - id - 名前 - company_type_id

company_types - id - タイプ

製品 - ID - 製品名 - 会社 ID

トランザクション - ID - ユーザー ID - 製品 ID - トランザクション日付

they will see a list of all the records that match their vendor

ここで、上記の表からベンダー ID を削除したことに気付くでしょう。これは、ベンダー ID が会社 ID と同じであるためです。同じものに対して 2 つの別々のリレーション ID を持つ意味はありません (間違っていたら訂正してください)

したがって、上記の変更により、次のようにこれらのレコードを簡単にリストできます。

<?php

  $db   = new PDO(/**Connection info here**/);
  $stmt = $db->prepare("
    SELECT
      a.id AS product_id,
      a.product_name
    FROM 
      products AS a
    INNER JOIN
      companies AS b ON b.id = a.company_id
    INNER JOIN
      company_types AS c ON c.id = b.type_id
    WHERE
      b.id = :company AND c.id = :companyType
  ");
  $stmt->bindParam(":company", $usersCompanyIdHere, PDO::PARAM_INT);
  $stmt->bindParam(":companyType", $usersCompanyTypeHere, PDO::PARAM_INT);

  $data = $stmt->execute();

  while ($row = $data->fetch()) {
    /** List of all the products for given company id**/
  }

?>

PDO を使用するようにコードを変更しました。ここに情報を詰め込みすぎたくはありませんが、ネイティブ関数よりもPDOを使用する利点を十分に強調することはできません。トップ10の結果。mysql_*

于 2012-10-19T14:42:54.117 に答える