我试图从三个表中选择:产品,出价,订单。
在投标中,它只是一个投标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)
现在是您的第二个问题,您正在请求帮助的问题。根据您提供的模式,没有好的方法来表示这样的查询。恐怕由于在BidsOrders之间分散了扩展基数,查询永远无法正常工作。
如果您还想尝试,这里是三表连接的起点:
SELECT * FROM products
LEFT JOIN bids ON products.id = bids.item
LEFT JOIN orders ON products.id = orders.product

左连接将确保检索所有产品记录。从基数的角度来看,问题是每个产品的行数太多(每个产品的出价数乘以该产品的订单数)。

10-08 09:40