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 语句说 if type = r, show this else show that。最好的办法?

当我想在登录时显示信息时,会出现第二个问题。假设供应商登录,他们将看到与其供应商 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 条示例记录。它不是只显示 4,而是显示 16,因为 和 的值$num都是$num14 并且$num循环$num1了四次。

  1. 如何解决此问题并仅显示 4 条记录?

谢谢您的帮助。如果您需要对任何部分进行任何澄清,请告诉我。

4

1 回答 1

1

您的数据库设置可能需要重新考虑。

我认为这是因为您需要知道每个用户所在的公司,并且您不能在产品表中拥有它。

我会考虑像这样将外键添加到用户表中(假设一个用户有一个公司,一个公司有很多用户)。我还提出了一些其他建议,如下所示:

用户 - id - company_id - first_name - last_name

公司 - id - 名称 - company_type_id

company_types - id - 类型

产品 - id - product_name - company_id

交易 - id - user_id - product_id - transaction_date

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

现在您会注意到我从上表中删除了供应商 ID - 这是因为供应商 ID 与公司 ID 相同。对同一件事有两个单独的关系 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相对于本机函数的好处mysql_*- 进行 Google 搜索,我可以看到很多有用且相关的信息前 10 名的结果。

于 2012-10-19T14:42:54.117 回答