mySQL - 如何显示消息表中的所有记录,而不仅仅是一个

时间:2014-04-01 21:10:18

标签: sql mysqli

这就是我为我的网站构建一个消息传递系统的方式,这就是我希望两个用途之间的所有对话都是在另外几个地方的地方,

fra_id是发送消息的人

til_id是接收消息的人。

现在的问题是,即使对话中有更多消息,它也只会显示一条消息。

SELECT 
  fms_bruger.fornavn, 
  fms_bruger.efternavn, 
  fms_opslagpm.id, 
  fms_opslagpm.title, 
  fms_opslagpm.besked 
FROM fms_bruger 
INNER JOIN fms_opslagpm ON fms_bruger.id=fms_opslagpm.fra_id 
WHERE fms_opslagpm.id = ? 
GROUP BY fms_opslagpm.title 
ORDER BY fms_opslagpm.datotid DESC

我怎么能这样做所有的采访都有一个地方而不是在页面上。

EIDT

$sql = "SELECT fms_bruger.fornavn, fms_bruger.efternavn, fms_opslagpm.id, 
fms_opslagpm.title, fms_opslagpm.besked 
FROM fms_bruger INNER JOIN 
fms_opslagpm ON fms_bruger.id=fms_opslagpm.fra_id 
WHERE fms_opslagpm.id = ? 
GROUP BY fms_opslagpm.title AND fra_id = ? OR til_id = ? 
ORDER BY fms_opslagpm.datotid DESC";

if ($stmt = $this->mysqli->prepare($sql)) { 
    $stmt->bind_param('iii', $id, $fra_id, $til_id);
    $id = $_GET["id"];
    $fra_id = $_SESSION["id"];
    $til_id = $_SESSION["id"];

EIDT EIDT

SELECT fms_bruger.fornavn, fms_bruger.efternavn, fms_opslagpm.id, fms_opslagpm.title, 
fms_opslagpm.besked 
FROM fms_bruger INNER JOIN fms_opslagpm 
ON fms_bruger.id=fms_opslagpm.fra_id 
WHERE fms_opslagpm.id = ? 
GROUP BY fms_opslagpm.title 
AND (fra_id = ? OR til_id = ?) 
ORDER BY fms_opslagpm.datotid DESC

我在这里试试:

SELECT fms_bruger.fornavn, fms_bruger.efternavn, fms_opslagpm.id, fms_opslagpm.title, 
fms_opslagpm.besked 
FROM fms_bruger INNER JOIN fms_opslagpm 
ON fms_bruger.id=fms_opslagpm.fra_id 
WHERE fms_opslagpm.id = ? and (fra_id = ? OR til_id = ?)
GROUP BY fms_opslagpm.title  
ORDER BY fms_opslagpm.datotid DESC

我再试一次

SELECT fms_bruger.fornavn, fms_bruger.efternavn, fms_opslagpm.id, fms_opslagpm.title, 
fms_opslagpm.besked 
FROM fms_bruger INNER JOIN fms_opslagpm 
ON fms_bruger.id=fms_opslagpm.fra_id 
WHERE fms_opslagpm.id = ? and (fra_id = ? OR til_id = ?) 
ORDER BY fms_opslagpm.datotid DESC

2 个答案:

答案 0 :(得分:1)

您的问题是您只选择

WHERE fms_opslagpm.id = ?

因此它只返回id上完全匹配的1行。您似乎在尝试同时选择与title

的行具有相同id的行
GROUP BY fms_opslagpm.title

但即使您返回的行数超过1行,也会将结果再次折叠为1行。

您需要更改查询以获取行title的{​​{1}},并使用WHERE fms_opslagpm.id = ?选择具有相同OR的所有其他行。

尝试 -

title

请参阅此SQLFiddle示例 - http://sqlfiddle.com/#!2/36d534/6

您还需要在SELECT fms_bruger.fornavn, fms_bruger.efternavn, fms_opslagpm.id, fms_opslagpm.title, fms_opslagpm.besked FROM fms_bruger INNER JOIN fms_opslagpm ON fms_bruger.id=fms_opslagpm.fra_id WHERE ( fms_opslagpm.id = ? OR fms_opslagpm.title = ( SELECT fms_opslagpm.title FROM fms_opslagpm WHERE fms_opslagpm.id = ? ) ) AND ( fms_opslagpm.fra_id = ? OR fms_opslagpm.til_id = ? ) ORDER BY fms_opslagpm.datotid DESC

中添加1个参数
bind_param

答案 1 :(得分:0)

您的GROUP BY子句正在使用相同的title折叠记录。在GROUP BY子句中添加另一个字段,或将其丢弃 - 它目前尚未用于提供聚合。