我试图从三个表中选择:产品,出价,订单。
在投标中,它只是一个投标id,用户名,金额,时间戳,日期,项目
在产品中,它有多种,价格,描述,图像,位置,运输等
按顺序是地址,用户名,名字,产品,发货
我正在尝试从用户名为“”的所有表中选择所有行?因此,我可以通过$query->shipped(ordertable)或paid$query->status(ordertable)检查项目是否已发货,而不是执行foreach和另一个查询
现在,我有一个查询正在为其中两个表工作,但是当我添加订单时,没有产品显示:
工作
SELECT * FROM bids,products WHERE bids.username=? AND NOW() > products.enddate GROUP BY item ORDER BY amount DESC
不起作用,但需要这种类型的查询
SELECT * FROM bids,products,orders WHERE bids.username=? AND NOW() > products.enddate GROUP BY item ORDER BY amount DESC
我也该如何选择订单呢。我已附上表格的结构以供参考
产品--需要全部
命令--需要全部
出价--需要全部
最佳答案
为了准确地从多个表中进行选择,必须具有外键。请注意,您的第一个查询在没有外键列联接的情况下被断开。
我看到您的Bids
表有一列item
。如果该列是我认为的那样,那么该列的名称应该类似于product_id
,并且应该指定为对id
表的Products
列的外键引用。这就是我们如何确保每个出价都是为了一个有效的产品。
鉴于item
中的Bids
列是Products
的外键,您的第一个查询将正确地声明为(根据引用完整性和基数):
SELECT * FROM bids INNER JOIN products ON bids.item = products.id
WHERE bids.username=? AND NOW() > products.enddate
ORDER BY amount DESC
如果要确保检索所有产品记录,而不管它们是否有出价,请使用上面的
RIGHT JOIN
而不是INNER JOIN
,并将用户名筛选器更改为(bids.username = ? OR bids.username IS NULL)
。现在是您的第二个问题,您正在请求帮助的问题。根据您提供的模式,没有好的方法来表示这样的查询。恐怕由于在
Bids
和Orders
之间分散了扩展基数,查询永远无法正常工作。如果您还想尝试,这里是三表连接的起点:
SELECT * FROM products
LEFT JOIN bids ON products.id = bids.item
LEFT JOIN orders ON products.id = orders.product
左连接将确保检索所有产品记录。从基数的角度来看,问题是每个产品的行数太多(每个产品的出价数乘以该产品的订单数)。