2009-12-24 19 views
1

使用传递来从另一个表中获取结果的每行的ID,while循环中的mysql查询可以吗?还是有更好的方法来做到这一点?可以在MySQL中运行WHILE循环吗?

$q = $__FROG_CONN__->query("SELECT cms_page.id, cms_page.title, cms_page.slug, cms_page_part.* FROM cms_page LEFT JOIN cms_page_part ON cms_page_part.page_id=cms_page.id WHERE cms_page.parent_id='8'"); 
$r = $q->fetchAll(PDO::FETCH_ASSOC); 

echo '<ul id="project-list">'; 
    foreach ($r as $row) { 
    echo '<li>'; 
    echo '<a href="'.$row["slug"].'.html"><img src="<img src="phpThumb/phpThumb.php?src=public/images/'.$row[0].'/th.jpg&w=162" alt="" /></a>'; 
    echo '<div class="p-text">'; 
    echo '<h4>'.$row["location"].'<span>'.$row["project_date"].'</span></h4>'; 
    echo '<p>'.$row["body"].'</p>'; 
    echo '</div>'; 
    echo '</li>'; 
    } 
echo '</ul>'; 

我想从SQL查询匹配的另一个表中拉project_date,body和location字段。标题和slu are被放在另一张桌子上。应该只有最多八个或更多的结果,但即时获得更多。

+0

ID从哪里来?您的用户是否将rowid直接输入用户界面,或者您是否从另一个查询中获取它们? –

+1

问题标题太笼统 –

+0

什么是您的“内部”查询?我在这里只看到一个查询。 – Quassnoi

回答

1

为了减少预先执行查询的开销,您可能需要查看获取单个查询中的所有数据。在这种情况下,你可能想看看IN(),例如

SELECT * WHERE x IN (1, 2); 

还有()之间

SELECT * WHERE x BETWEEN 1 AND 2; 

mysql docs以获取更多信息

+0

即时通讯从两个表中获取结果,但我需要进行到其他ID以确保我拉相关的行...所以在哪里真的没有涉及我不认为! – Andy

+0

@Andy在这种情况下,JOIN可能就是你正在寻找的东西。 – Daan

+0

我尝试加入... $ q = $ __ FROG_CONN __-> query(“SELECT cms_page.id,cms_page.title,cms_page.slug,cms_page_part。* FROM cms_page LEFT JOIN cms_page_part ON cms_page_part.page_id = cms_page.id WHERE cms_page.parent_id = '8'“); 它只是给我加载的结果...包括所有的合并后的页面部分即时消息后,但不是作为单行 – Andy

0

在一个小的应用程序/小结果集,这可能是好的,但它导致了很多(小)调用数据库。

如果您可以找到一种替代方法(可能参见Yacoby's suggestion?),您可以在其中调用数据库,这可能会更好。

编辑

如果你只在的ID从一个表兴趣,以获得正确的结果出来另一个表的,也许是联接是你在找什么?

SELECT t1.fieldA, t1.fieldB 
FROM table1 t1 
JOIN table2 t2 ON t1.ID = t2.ID 
WHERE t2.someField = 'someValue' 
+0

我需要结果从两个表合并为一行...所以我可以打电话$ r [“table1colum2”]或$ r [“table2colum3”],但从同样的$ r – Andy

+0

这正是JOIN可以做的你:'SELECT * ...'将从两个表中选择所有的列,或者你可以从这两个表中选择特定的列:'SELECT t1.fieldA,t2.fieldX FROM table1 t1 JOIN table2 t2 ON t1.ID = t2。 ID' – Daan

0

我会尝试建立查询的方式,我只需要一次通过。类似于WHERE ID = 1或ID = 2 OR ...传递多个查询并返回多个记录集在处理和网络流量方面是昂贵的。

+0

叶我认为这是事实,但我不知道更好的方式来做到这一点... where子句不包括什么即时尝试非强制性。我希望它做到了! – Andy

0

在while循环中使用传递来从另一个表中获取结果的每行的ID的mysql查询可以吗?还是有更好的方法来做到这一点?

您应该在SQL中重新构造您的查询。再说了,把id s转换为内存表,并在一个JOIN使用它:

SELECT * 
FROM idtable 
JOIN mytable 
ON  mytable.id = idtable.id 

这样,MySQL会让你的循环,而且会使他们(通常)更有效的方式。

SQL是一种设计用于处理集合的语言。因此,如果你有一组id s和一个表(它是一组元组),你的第一个想法应该是“如何使用SQL将这些基于集合的操作应用于这些集合”?

当然可以在循环中运行一堆简单的查询,但这样做只需做引擎开发人员可能已经为您做的额外工作(并且通常以更有效的方式完成)。

您可能需要阅读这篇文章在我的博客:

3

使用中的建议是好的,但如果你从另一个查询得到的ID,它可能会更好使用连接将这两个查询组合成一个查询。

相反的:

SELECT id FROM users WHERE age <30 
SELECT id, x FROM userinfo WHERE userid IN ($id1, $id2, ..., $idn) 

做:

SELECT users.id, userinfo.x 
FROM users 
LEFT JOIN userinfo ON userinfo.userid = users.id 
WHERE age < 30 
+0

我编辑了我的代码......向您展示我正在使用连接并且它不适用于我...不确定什么是错误的......我得到了打印在列表中的每个组合的四个结果(即对于每个投资组合存在的页面部分表的四个结果) – Andy

0

这将是非常低效的,你想要的是连接表上的ID

SELECT * FROM table1 LEFT JOIN table2 ON (table1.ID = table2.ID) WHERE condition 

Mysql join documentation

这将返回一组包含所有需要的信息的行,从两个表中返回。

相关问题