如何简化这个mysql查询

时间:2014-01-10 15:49:03

标签: php mysql

有没有办法简化下面的查询。正如您可以为每个用户行所做的那样,我必须对数据存储区运行3个查询。

$sql = "SELECT * FROM Users"
$result = mysql_query($sql);
while($row=mysql_fetch_assoc($result) {
 if($row['first_dataid'] != 0) {
   $d1 = mysql_fetch_assoc(mysql_query("SELECT name FROM datastore WHERE dataid = '".$row['first_dataid']."'"));
  }
 if($row['second_dataid'] != 0) {
   $d2 = mysql_fetch_assoc(mysql_query("SELECT name FROM datastore WHERE dataid = '".$row['second_dataid']."'"));
  }
 if($row['third_dataid'] != 0) {
   $d3 = mysql_fetch_assoc(mysql_query("SELECT name FROM datastore WHERE dataid = '".$row['third_dataid']."'"));
  }

}

我有一张表datastore

dataid, name, description, createdate

然后我有许多不同的表格链接到dataid的{​​{1}},例如

用户

datastore

我在想mysql join,但不确定它是否只有一列,然后我可以尝试类似

userid, username, first_dataid, second_dataid, third_dataid

4 个答案:

答案 0 :(得分:5)

select u.*,
COALESCE(d1.name, d2.name, d3.name) AS name 
from users u 
left join datastore d1 ON d1.dataid = u.first_datastoreid 
left join datastore d2 ON d2.dataid = u.second_datastoreid 
left join datastore d3 ON d3.dataid = u.third_datastoreid 

COALESCE行可以为您填写任何内容。(感谢@DigitalChris)

你应该真正规范化这些数据,你不应该有1,2,3等字段。

答案 1 :(得分:0)

目前还不清楚您将如何使用这些数据,因此我无法向您推荐最佳查询。

响应您在问题结束时的上一次查询尝试 - 这将为您提供所有关联的数据存储区,其中包含1个连接,每个连接位于separete行:

SELECT u.*, d.dataid, d.name -- put columns you need here
  FROM users u 
  LEFT JOIN datastore d 
    ON d.dataid in (u.first_datastoreid, u.second_dataid, u.third_dataid)

为了更好地规范化,请考虑使用多对多关系https://stackoverflow.com/a/2923921/350021

答案 2 :(得分:-1)

您可以尝试此sql查询

select u.* from users u 
left join datastore d1 ON d1.dataid = u.first_dataid
left join datastore d2 ON d2.dataid = u.second_dataid
left join datastore d3 ON d3.dataid = u.third_dataid

答案 3 :(得分:-1)

SELECT * FROM Users
LEFT JOIN datastore datastore1 ON Users.first_dataid = datastore1.dataid
LEFT JOIN datastore datastore2 ON Users.second_dataid = datastore2.dataid
LEFT JOIN datastore datastore3 ON Users.third_dataid = datastore3.dataid