2010-11-20 61 views
2

我有一个查询的起点:MySQL的多个表中选择与WHERE不是在比较2个表

SELECT tf_threads.*, tf_posts.* FROM tf_threads, tf_posts WHERE tf_threads.thread_id=54

。当然,这是一个刚刚开始 - 我在一次移动一个步骤,随着时间的流逝,它会变得更好。然而,我现在坚持的是如何获得WHERE子句,以将一个表中的列与PHP变量进行比较,而不是另一列。

的PHP我是这样的:

SELECT $tf_threads.*, $tf_posts.* FROM $tf_threads, $tf_posts WHERE $tf_threads.thread_id=$tf_this_forum

这里最重要的一点是$tf_threads.thread_id=$tf_this_forum。当我尝试这个时,它只是返回没有行,MySQL说:Impossible WHERE noticed after reading const tables。当然这应该很好吗?显然,它没有,所以任何人都可以在这里帮忙吗?

非常感谢,

詹姆斯

编辑:我也尝试过做查询纯的MySQL这样的:

SELECT tf_threads.*, tf_posts.* FROM tf_threads, tf_posts WHERE tf_threads.thread_id=54

都与行情轮54和没有,没有相同的行结果。

回答

1

您的查询隐式执行CROSS JOIN,它似乎包含太多的$标志。

我建议以下的额外的改变:

  • 使用ANSI-92连接(join关键字),而不是ANSI-89连接(逗号)。
  • 使用intval应用于$ tf_this_forum以确保它是一个整数。
  • 考虑使用绑定参数而不是动态地从字符串构造查询。
  • 当您引用PHP变量时,仅使用$

关于错误不可能WHERE阅读常数表后发现,这意味着没有行匹配。检查你正在搜索的行实际上是否存在于你的数据库中。它可能不是。

+0

谢谢!你的'JOIN'项目符号效果很好;做这个查询是完美的:'SELECT tf_threads。*,tf_posts。* FROM tf_threads LEFT JOIN tf_posts ON tf_threads.thread_id = 54' – Bojangles 2010-11-20 12:32:26

1
SELECT tf_threads.*, tf_posts.* FROM tf_threads, tf_posts WHERE 
tf_threads.thread_id='$tf_this_forum' 

注意:您应该mysql_real_escape_string$tf_this_forum如果尚未逃脱。

+0

感谢您的输入,但thread_id是一个数字字段 - 我应该在我的OP中包含它以避免混淆。请参阅@Mark Byer的解决方案文章:-) – Bojangles 2010-11-20 12:34:43

+0

此外,对其他用户的好建议+1,您无法始终保证变量将为数字! – Bojangles 2010-11-20 12:35:06