如何正确制定3表mysql查询

时间:2009-08-01 14:35:27

标签: php mysql

我需要执行以下任务的最佳方式。如果可能的话,一直把它给我输出变量,这样我可以更好地看到最新情况,很多时候你们都认为我比我更聪明。

表1包含用户信息,名字和姓氏,电子邮件等。表1中的主要auto_increment键是id。 表2中,包含一系列名字和姓氏,其关键字是xid,而表1的id(用于仅显示所有者列表)是uid。 表3,保存了表2中用户列表的配置数据。由于每个用户每个列表可以有多个配置,因此将它包含在表2中是不明智的。因此表3具有cxid(xid的表2键,标记哪个列出其for,然后uid,标记哪个表1用户可以访问该配置。其auto_increment键称为cid。

所以要打破它

Table 1(user) - Primary key = id
Table 2(list) - Primary key = xid, and user field is uid.
Table 3(config) - Primary key = cid, list field is cxid, and user field is uid.

我需要做的是在表3上制定一个mysql查询,这样对于每一行,它都会提取cxid和uid,然后查询表2中的特定列表。一旦找到列表,它就需要从表2中的该行中提取所有数据,以便它可以使用该数据执行一个函数。

我不确定从哪里开始写这个最有效的方式,我确定有一种简单的方法来做到这一点。目前,上述值只是在URL中传递,但我要将其更改为会话,但只是假设在查询开始之前,我已将每个变量定义为

$variable = $_GET['variable'];

所以变量是$ id,$ uid,$ cxid,$ xid

2 个答案:

答案 0 :(得分:1)

这应该做你想要的......

SELECT *
FROM user AS [u]
JOIN list AS [l]
    ON l.uid = u.id
JOIN config AS [c]
    ON c.uid = u.id
    AND c.cxid = l.xid
WHERE u.id = $id
AND l.xid = $xid
AND c.cxid = $cxid

我建议您使用一致的主键名称和更好的外键名称来提高可维护性和可预测性。

CREATE TABLE user
(
id INT NOT NULL
,CONSTRAINT pk_userId PRIMARY KEY (id)
)


CREATE TABLE list
(
id INT NOT NULL
,userId INT NOT NULL
,CONSTRAINT pk_listId PRIMARY KEY (id)
,CONSTRAINT fk_userList FOREIGN KEY (userId) REFERENCES user(id)
)


CREATE TABLE config
(
id INT NOT NULL
,userId INT NOT NULL
,listId INT NOT NULL
,CONSTRAINT pk_configId PRIMARY KEY (id)
,CONSTRAINT fk_userConfig FOREIGN KEY (userId) REFERENCES user(id)
,CONSTRAINT fk_listConfig FOREIGN KEY (listId) REFERENCES list(id)
)

答案 1 :(得分:0)

从您描述的方式来看,表关系似乎是:

  • 一个用户有很多列表
  • 一个列表有很多配置

如果我正确理解了问题,您需要浏览每个配置条目,并检索该配置的列表集。

如果我使用您的条款,架构看起来像:

  • 用户(ID)
  • 列表(xid,uid)
  • Config(cid,cxid,uid)

其中id = uid,xid = cxid。

对于Config中的每条记录,您要检索的信息是其所有数据以及与该记录对应的所有列表数据(您是否还需要用户数据?)

这看起来像一个直接的关系,因此您可以使用一个SQL检索所有数据:

select c.*, l.*, u.*
from Config c
join List l
on c.cxid = l.xid
join User u
on u.id = l.uid

此查询将获取Config表中的每条记录,其中包含拥有该配置的List的所有数据,还包含拥有该列表的用户的所有数据。

如果要检索一个特定配置条目的数据,可以将sql附加到这样读取(请注意,您只需要$ cid值,因为这是此关系中最深的主键):

select c.*, l.*, u.*
from Config c
join List l
on c.cxid = l.xid
join User u
on u.id = l.uid
where c.cid = $cid

因此,在PHP术语中,您可能希望如此处理它:

// here is the sql query
$query = "select c.*, l.*, u.* from Config c join List l on c.cxid = l.xid join User u on u.id = l.uid";

// here are the results from MySQL
$result = mysql_query($query);

// and now for each result, throw it into an array called $row
while($row = mysql_fetch_assoc($result))
{
  // get some data from that row, for example, Config.`data`, List.`functionname`, and User.`FirstName`
  $config_data = $row['data'];
  $function_name = $row['functionname'];
  $first_name = $row['FirstName'];

  // now do whatever you'd like with this data, before looping to the next record...
  some_function($config_data, $function_name, $first_name);
}