合并两个表并回显结果(PHP MYSQL)

时间:2013-11-27 12:47:37

标签: php mysql

我有两张桌子; 'client'和'sys_notes'在同一个DB中。 (SELECT client.*, sys_notes.* FROM client LEFT JOIN sys_notes ON sys_notes.client_id = client.id ORDER BY create_date DESC

我需要将两个表echo组合在同一个<div>content</div>中,如下所示:

从client = first.name + last.name(例如Scott)回复所有内容 从客户端回复所有=角色
从客户端回复所有内容=其他任何内容 回复所有来自Robert Scott发送的sys_notes = note1,note2,note3,note(etc。)...
从客户端回复所有内容=其他任何内容 从客户端回复所有内容=其他任何内容

示例输出:


<div class="content">
罗伯特斯科特郎
罗伯特在公司的订单办公室工作 罗伯特的笔记:

  • 今天:(来自sys_notes表)
  • 昨天:(来自sys_notes表)
  • 19.oct 2013 :(来自sys_notes表)
罗伯特的电话:000 000 000
罗伯特的电子邮件:等 关于罗伯特的其他信息:............

</div>

<div class="content">

Lisa Johansson

Lisa在营销部门工作 丽莎的笔记:

  • 今天:(来自sys_notes表)
  • 12.may 2013 :(来自sys_notes表)

Lisa的电话:000 000 000
丽莎的电子邮件:等 关于丽莎的其他信息:............

</div>

当我今天回应结果时,罗伯特正多次“回应”他的笔记,每个<div class="content">都有一个音符。 (在Robert的例子中有3个音符和3个不同的Robert-div被回应。)

请帮忙。

---更新---

-- Table structure for table `sys_notes`

CREATE TABLE IF NOT EXISTS `sys_notes` (
  `note_id` int(11) NOT NULL AUTO_INCREMENT,
  `client_id` int(11) NOT NULL,
  `note_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `owning_user` varchar(50) NOT NULL,
  `note` varchar(500) NOT NULL,
  PRIMARY KEY (`note_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;

-- Table structure for table `client`

CREATE TABLE IF NOT EXISTS `client` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `create_date` datetime NOT NULL,
  `first_name` varchar(50) NOT NULL,
  `last_name` varchar(50) NOT NULL,
  `phone` varchar(20) NOT NULL,
  `email` varchar(50) NOT NULL,
  `issue` varchar(50) NOT NULL,
  `other` longtext NOT NULL,
  `owning_user` int(11) NOT NULL,
  `status` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1081 ;

2 个答案:

答案 0 :(得分:0)

使用:

SELECT DISTINCT

而不是:

SELECT

或GROUP BY语句。

- 编辑 -

示例回声:

$result = $db->query("SELECT client.*, GROUP_CONCAT(sys_notes.note SEPARATOR "|") as note, sys_notes.* FROM client LEFT JOIN sys_notes ON sys_notes.client_id = client.id GROUP BY sys_notes.client_id ORDER BY create_date DESC");

ob_start();
?>

<div class="content">

<?php
foreach($result as $row) {

    sprintf("<p>%s %s<br />%s<br />%s</p> %s <ul>", $row['firstname'], $row['lastname'], $row['role'], $row['desc'](example));

    foreach(explode("|", $row['note']) as $note) {
        sprintf("<li>%s</li>", $note);
    }

    sprintf("</ul>");
}
?>
</div>
<?

$result = ob_end_clean();

echo $result;

- 最终更新 -

<?php

try {
    $db = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

$result = $db->query('SELECT client . * , GROUP_CONCAT( sys_notes.note SEPARATOR  "|" ) AS n, sys_notes.* 
FROM client
LEFT JOIN sys_notes ON sys_notes.client_id = client.id
GROUP BY sys_notes.client_id
ORDER BY create_date DESC');

ob_start();
?>

<div class="content">

<?php

foreach($result as $row) {

    printf("<p>%s %s<br />%s</p> %s <ul>", $row['first_name'], $row['last_name'], $row['issue'], $row['other']);

    foreach(explode("|", $row['n']) as $note) {
        printf("<li>%s</li>", $note);
    }

    printf("</ul>");
}
?>
</div>
<?php

ob_end_flush();

答案 1 :(得分:0)

步骤:

1.Make Array
2.you use while loop for iterating complete if first+lastname is same then use same array index 
3. within loop make array like $a['notes'][]=$row['NOTES'];

然后回显上面的数组