【问题标题】:MYSQL joins not working as expectedMYSQL 连接未按预期工作
【发布时间】:2011-12-13 10:39:48
【问题描述】:

我正在尝试创建一个连接语句来解决我的问题,但我无法理解它。

我是join语句的新手,如果我的sql语句是废话,请多多包涵。

我有两张表,一张是用户就待售商品提出问题的问题表。

第二个是用户提出问题的项目表。

名为questions 的表一包含question_ref, questioner_user_ref, item_ref, seller_ref, question_text, timestamp

questions
===========
+--------------+--------------------+---------+-----------+--------------+----------+
| question_ref |questioner_user_ref |item_ref |seller_ref |question_text |timestamp |
+--------------+--------------------+---------+-----------+--------------+----------+

名为my_item_comments 的表二由questioner_ref, item_ref, last_question_ref 组成

my_item_comments
===========
+---------------+---------+------------------+
|questioner_ref |item_ref |last_question_ref |
+---------------+---------+------------------+

我设置了表 2 来跟踪用户提出问题的商品,以便在其他人向卖家提问或卖家回答时通知他们。

所以我想创建一个问题记录集 一个)。有人回答了有关用户正在销售的商品的问题 乙)。卖家回复了用户提出的问题,
C)。第三个用户就该用户也提出过问题的项目提出了问题。

有点像 facebook 的评论系统,您可以在其中了解人们对您评论过的状态所做的 cmet。

所以我现在的sql语句如下

$user_ref= current logged in user


  $sql=mysql_query("
    SELECT * FROM questions
    LEFT JOIN my_item_comments
    ON questions.item_ref=my_item_comments.item_ref
    WHERE questions.questioner_user_ref!='$user_ref'
    AND (questions.seller_ref='$user_ref' OR questions.item_ref=my_item_comments.item_ref
    ORDER BY timestamp DESC");

结果不起作用,我认为是因为OR questions.item_ref=my_item_comments.item_ref,但对于我的一生,我无法解决。

任何帮助都将不胜感激,即使这意味着用更多表或表中的新字段重组我的数据库。

提前致谢,巴里

【问题讨论】:

  • 其格式易于阅读。

标签: mysql join left-join


【解决方案1】:
SELECT * FROM questions
LEFT JOIN my_item_comments ON questions.item_ref=my_item_comments.item_ref
WHERE 
   questions.questioner_user_ref != '$user_ref' AND 
   (questions.seller_ref='$user_ref' OR questions.item_ref=my_item_comments.item_ref)
ORDER BY timestamp DESC

我认为您缺少一个 ) 来包含 OR 子句(在上面的示例中我添加了它)

【讨论】:

  • 对不起,这是一个错字,我的陈述中有结束语 ),我遇到的问题是它返回所有链接到第二个表的问题,即使用户之前没有评论物品。我的问题不在于语法,而在于 join 语句的结构。
  • 我不明白你为什么要再次这样做` OR questions.item_ref=my_item_cmets.item_ref` => 这是加入条件,所以你应该删除OR part
  • 我这样做了,但它没有返回用户提出的卖家已回复的问题
  • 这就是你要找的吗?:找到$user_ref标识的用户提出的所有问题(条件好像是questioner_user_ref = '$user_ref')并且卖家已经回复了?
【解决方案2】:

您应该尝试提高您自己和我们的可读性,以便更容易调试并且我们更容易为您提供帮助:-)

$q = "
    SELECT * 
      FROM questions
RIGHT JOIN my_item_comments ON questions.item_ref = my_item_comments.item_ref
     WHERE questions.questioner_user_ref != '".$user_ref."'
       AND (    questions.seller_ref = '".$user_ref."' 
            OR  questions.item_ref=my_item_comments.item_ref
            )
  ORDER BY timestamp DESC";

$rs = mysql_query($q);

最好只查询带有虚拟数据的查询

    SELECT * 
      FROM questions
RIGHT JOIN my_item_comments ON questions.item_ref = my_item_comments.item_ref
     WHERE questions.questioner_user_ref != 'dummy_ref'
       AND (    questions.seller_ref = 'dummy_ref' 
            OR  questions.item_ref=my_item_comments.item_ref
            )
  ORDER BY timestamp DESC

尝试使用right join 进行查询。左连接确实会得到所有的行。

【讨论】:

  • 感谢理查德,但这不是我遇到问题的语法,而是实际的语句,它没有给我所需的结果
  • 我试过right join,left join,inner join,但它仍然返回同样的东西,奇怪的是当我运行mysql_fetch_arraywhile循环时,@即使表中有其他questoner_user_ref,987654329@ 也始终相同。这就是我质疑sql语句的原因
  • 好的,所以我已将语句更改为$sql=mysql_query("SELECT * FROM questions LEFT JOIN my_item_comments ON questions.item_ref=my_item_comments.item_ref WHERE questions.questioner_user_ref!='$user_ref' OR questions.lister_ref='$user_ref' ORDER BY timestamp DESC");,当我检查结果时,它会返回正确的结果......几乎!!
  • 我已将虚拟数据输入到我提出两个问题的表格中,然后另一个用户回答了这两个问题并询问了有关我的项目的问题。因此我应该返回 3 个问题。但是我收到了 5 个问题,当我检查问题的 question_ref 时,声明返回的参考列表是 1、1、2、2、3。这就是我对连接的了解不足的地方。有什么想法吗?
  • 很抱歉,当我运行 while($row=mysql_fetch_array($sql)) { echo "question_ref=".$row['question_ref']."<br>"; } 时,返回是 question_ref=52 question_ref=51 question_ref=51 question_ref=50 question_ref=50 当我预期 question_ref=50 question_ref=51 question_ref =52,谁能解释为什么join语句使循环重复question_ref
猜你喜欢
  • 2011-10-27
  • 2015-06-17
  • 1970-01-01
  • 2012-03-31
  • 2013-08-06
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多