2012-10-14 60 views
0

使用PHP,对于MySQL查询结果集中的每一行,我需要执行另一个MySQL查询。到目前为止,我已经得到了在PHP循环中追加MySQL结果

$result = mysql_query("SELECT id, state FROM states WHERE region='given_region'") 
or die(mysql_error()); 

while($row = mysql_fetch_row($result)) 
{ 
    $state = $row['state']; 
    $r = mysql_query("SELECT * FROM locations WHERE state REGEXP '(^|,)".$state."($|,)'"); 
} 

现在我需要所有的结果$ R的追加到一个结果集,我可以再用一个标准while循环,但是,我非常有限的PHP技能是通过迭代让我无法获得代码来做到这一点。

任何人都可以提供任何有关如何将所有结果追加到给定的while循环内的一个集合的见解吗?

谢谢!

回答

4

了解SQL joins

SELECT states.id, states.state, locations.* 
FROM states LEFT JOIN locations USING(state) 
WHERE states.region = 'given_region' 
+0

我确实与更高级的联接斗争,所以我可能会错,但我不认为我可以在我的联接中使用Join案件。我过分简化了上面的示例。在while循环中的查询中,我实际上将单个值状态与逗号分隔列表中的可能值进行匹配。所以'状态'列实际上是一个状态列表,我想匹配$ state在列表中的所有行。我修改了上面的示例。 – JToland

+0

@JToland:我强烈建议你[标准化](http://en.wikipedia.org/wiki/Database_normalization)你的模式。但是,如果这是不可能的,你可以用'ON FIND_IN_SET(states.state,locations.state)'替换上面的'USING(state)'' – eggyal

+0

我知道规范化数据肯定是这个长期的最好方法,但不幸的是,这不是我可以轻易改变的(或者至少不够快以适应我目前的需要)。我用'ON FIND_IN_SET'尝试了上面的查询,并且工作得很好!它似乎给了我所需要的,而且比我之前试图做的更容易,谢谢很多@eyal! – JToland

0

你可以尝试使用的foreach,而不是同时的。我很抱歉,但我真的没有得到这个问题。

如果你使用一个foreach,你可以用它生成整个表,如果你愿意。让我给你举个例子:

<?php 
Foreach($result as $output) : ?> 
<div id="results"> 
<table id="generated table"> 
<tr> 
<td><?php echo $output->id ?></td><td> <?php echo $output->state ?></td> 
</tr> 
</table> 
<?php endforeach ?> 
</div> 

你要知道,如果你使用foreaches你可以得到整个表,而不是使用查询来选择一些列。然后你通过foreach输出列数据(通过使用$ output-> columnname命令)