【问题标题】:mysql how to show some rows of table depending on one field and depending on one field in other table?mysql如何根据一个字段和另一个表中的一个字段显示一些表行?
【发布时间】:2013-05-08 00:43:23
【问题描述】:

我有一个脚本,会员可以在其中登录并按类别阅读我拥有的帖子 表称为帖子,然后他们单击一个按钮并将一个条目插入到表中 调用postsread 收集postname、他们的memberid 和显示的日期 他们已经读过了。我正在寻找的是一个查询 只向他们显示他们尚未阅读的帖子。

**表格** **字段** 帖子 ID、姓名、日期、发件人、主题、信息、猫 postread id、postname、memberid、日期 用户 id、memberid、pass、fname、lname、email

Sessions 已经持有他们的 $_SESSION['memberid'],但不确定如何 在两个表之间查询以获得我正在寻找的内容。 就像:显示帖子中的所有帖子,除了帖子中的帖子与成员一起阅读 memberid 在相应的邮件名称旁边。 我使用的是 php 5.3 版和 mysql 5.0.96。

我正在使用以下内容来显示数据库中的帖子:

$sql=mysql_query("SELECT * FROM posts WHERE cat='1' ORDER BY date DESC");

但这并不能区分成员是否点击了 见过与否。

我看过很多地方,看到的例子很接近,但无法找到 适合我需要的东西。我不完全明白如何写这个。我试过很多 没有成功。如果您需要额外的描述,请询问。感谢您的宝贵时间。

【问题讨论】:

  • 请不要在新代码中使用mysql_query。这是 PHP 2.0 中的一个陈旧的界面,在 PHP 的未来版本中已被弃用并被删除。 Switching to PDO 通常并不难,可能会解决很多你可能不知道的SQL escaping problems
  • 为什么你给每条记录都提供了 id 而没有使用它们?不要使用posts 中的name 列(postsread 中的postname)将postsreadposts 关联,使用id!所以在postsread 表中,您只需要postidmemberiddate。如果您需要唯一标识符列,可能还有id
  • 谢谢。我将开始阅读 PDO。我将筛选页面并尝试更接近地参考帖子阅读 - 帖子。 id 以某种方式自动创建。我从没想过它会造成任何伤害,所以我会看看为什么要创建它们。谢谢大家的帮助。
  • id 通常是个好东西——你应该使用它们!

标签: php mysql phpmyadmin


【解决方案1】:

您需要针对posts_read 表构造JOIN 条件,或使用IN 子句排除它们。您应该非常小心您的索引,因为这些类型的查询可能会变得非常缓慢,并且在处理大量数据时会占用大量数据库。

SELECT * FROM posts WHERE cat=:cat AND name NOT IN (SELECT postname FROM postsread WHERE memberid=:memberid)

这里:cat:memberid 是适当值的占位符。使用 PDO,您可以直接绑定到使用 execute 函数的那些。

请注意,加入字符串比加入id 类型值要慢得多。您可能希望将 postsread 表引用 idposts 改为。

【讨论】:

  • 我无法让这个工作我刚刚收到Parse error: syntax error, unexpected T_STRING in /home/content/.../cat1.php on line 1 谢谢你的帮助。
  • 这看起来像是语法错误。在我的示例中,我什至没有任何引号。
  • 感谢您的帮助。我可以通过阅读您的回答来判断它正在要求我想要什么。也许我把它放错了。这就是我所做的一切。 SELECT * FROM posts WHERE cat='1' AND name NOT IN (SELECT postname FROM postsread WHERE memberid=$_SESSION['userid');我已经离开电脑好几年了,刚回来发现很多变化。
  • 你不能像那样塞入会话数据。您应该使用 PDO,它是 not hard to pick up,它允许使用占位符,但如果您坚持使用 mysql_query,则需要使用 mysql_real_escape_string$_SESSION['userid'] 如果已经在字符串中,则无法正确插入,至少在没有一些指导的情况下不会。
  • 更好的选择是:$query = sprintf('SELECT * FROM ... memberid=%s', mysql_real_escape_string($_SESSION['userid'])),您可以使用%s 表示后续值的去向。
【解决方案2】:

sql=mysql_query("SELECT * FROM posts WHERE cat='1' AND name NOT IN (SELECT postname FROM postsread WHERE memberid='$memberid') ORDER BY date DESC") or die (mysql_error());

Tadman 的回答是正确的;我在代码中有一些不应该存在的东西,但找不到它。最终我只是重写了这个东西并且它起作用了。以上对我有用,我感谢 Tadman 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多