如何简化这个mysql查询

use*_*214 1 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']."'"));
  }

}
Run Code Online (Sandbox Code Playgroud)

我有一张桌子 datastore

dataid, name, description, createdate
Run Code Online (Sandbox Code Playgroud)

然后,我有一个链接到许多不同的表dataiddatastore

用户

userid, username, first_dataid, second_dataid, third_dataid
Run Code Online (Sandbox Code Playgroud)

我在想mysql join但是不确定它是否是一列然后我可以尝试类似的东西

select u.* from users u left join datastore d ON d.dataid = u.first_datastoreid 
AND ..??
Run Code Online (Sandbox Code Playgroud)

Jes*_*ica 6

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 
Run Code Online (Sandbox Code Playgroud)

COALESCE线路可以为您提供任何一个.(感谢@DigitalChris)

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

  • [Coalesce()](http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce)比递归的IFNULL()更好 (3认同)