【发布时间】:2012-10-10 03:49:48
【问题描述】:
这是一个多部分的问题。我的数据库如下所示:
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
- 这是设置数据库的好方法吗?我正在考虑为餐馆和供应商设置单独的表,但希望它们使用相同的登录页面,而不必担心 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 和 $num1 的值都是 4 并且 $num 循环 $num1 四次。
- 如何解决此问题并仅显示 4 条记录?
感谢您的帮助。如果您需要任何说明,请告诉我。
【问题讨论】:
-
每个产品是否只有一个用户?如果是这样,您的架构看起来不错。如果没有,您需要创建一个包含 product_id、user_id 和交易日期的 product_users 表。
-
是的,每个产品只有一个用户。实际上,我应该将 Products 表重命名为 Transactions,因为本质上只有一种产品。
标签: php database-design foreign-keys nested-loops