如何获取存储在多个表中的用户信息并显示在他的个人资料中,是否可以通过单个查询


how to get users information stored in several tables and show in his profile, is it posible with single query?

我开发了一个在线拍卖系统,用户可以在其中出售或购买商品,我的问题是检索两个单独表中的拍卖相关信息,一个包含(auction_id,owner,title,description,base_price,..)等信息,另一个包含有关每次拍卖请求的信息: (bid_id,auction_id,bidder,price,date) ,每个用户都可以发布多个拍卖, i want to show the highest price and the bidder(some one who gives such price) for that price and number of requests additional to information stored in auction table for each auction但是当我加入表格时,如果没有拍卖请求,那么结果将为零,您将看到消息:没有要显示的信息,但用户刚刚发布了新的拍卖,我该怎么办?!我应该检查每次拍卖是否有请求,如果是,那么获取这些信息?!在代码重复中发送?这样,我应该在配置文件页面的单个请求中两次连接到数据库这是我的表和当前查询:

create table `auction`(
`auction_id`      INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`owner`            VARCHAR(32)  NOT NULL,
`group_id`         TINYINT      UNSIGNED NOT NULL ,
`title`            VARCHAR(100) NOT NULL,
`sale_type`        VARCHAR(1)   NOT NULL,
`base_price`       INT          NOT NULL,
`min_increase` INT NULL,
`photo`            VARCHAR(200) NULL,
`description`      VARCHAR(500) NOT NULL,
`start_date`       DATETIME     NOT NULL,
`termination_date` DATETIME     NULL,
`sold`             VARCHAR(1)   NOT NULL DEFAULT 0,
`purchaser`        VARCHAR(32)  NULL,
`deleted`          VARCHAR(1)   NOT NULL DEFAULT 0,
FOREIGN KEY(owner)     REFERENCES users(user_name) on delete cascade on update cascade,
FOREIGN KEY(purchaser) REFERENCES users(user_name) on delete cascade on update cascade,
FOREIGN KEY(group_id)  REFERENCES commodity_groups(group_id) on delete cascade on update cascade)
ENGINE=InnoDB default charset=utf8;
create table `bid`(
`bid_id`      INT         NOT NULL PRIMARY KEY AUTO_INCREMENT,
`auction_id`  INT  UNSIGNED        NOT NULL,
`bidder`      VARCHAR(32) NOT NULL,
`price`       INT         NOT NULL,
`date`        DATETIME    NOT NULL,
`deleted`     VARCHAR(1)  NOT NULL DEFAULT 0,
FOREIGN KEY(auction_id) REFERENCES auction(auction_id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY(bidder) REFERENCES users(user_name) ON DELETE CASCADE ON UPDATE CASCADE)
ENGINE=InnoDB default charset=utf8;    

这是我使用预处理语句的查询:

SELECT `auction`.`auction_id` , `title` , `base_price` , `min_increase` , `photo` ,    `description` , `start_date` , `termination_date` , `max_bidder` , `bids_count` , `max_bid`
FROM `auction` , (
SELECT `bid`.`auction_id` , `bidder` AS max_bidder, `bids_count` , `max_bid`
FROM `bid` , (
SELECT `auction_id` , count( bid_id ) AS bids_count, max( price ) AS max_bid
FROM `bid`
WHERE `auction_id`
IN (
SELECT `auction_id`
FROM `auction`
WHERE `owner` = ?
)
GROUP BY (
auction_id
)
) AS temp
WHERE `bid`.`auction_id` = `temp`.`auction_id`
AND `price` = `max_bid`
) AS temp2
WHERE `auction`.`auction_id` = `temp2`.`auction_id`

很明显,如果没有拍卖请求,结果将为零,并且不会在他的个人资料中向用户显示拍卖,但是他或她刚刚发布了新的拍卖,如果有人可以帮助我,我将不胜感激

你遇到的更多的是数据库设计问题和未来的可伸缩性问题,而不是实际问题。你知道如果你愿意,你可以提出两个请求。

如果您关心扩展,则必须非常仔细地考虑要在多个服务器上复制哪些用户信息,以及如何同步这些信息。基本答案是:是的,您可以使用联接来包含所需的用户信息。但一个更复杂的答案是,您可能希望创建迷你表,其中包含少量用户信息(复制和同步),您可以非常快速地加入这些信息,没有用户会写入这些信息 - 换句话说,它们仅由主表通过从属设置或某些cron作业写入。

很大程度上取决于您期望您的网站有多大以及有多少人可能正在写入用户表。假设很多人会写入拍卖表,所以理想情况下你不希望该表上有任何外键依赖关系,否则你会得到死锁。它可能应该是 ISAM 或联合表。