Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从MySQL数据库连接中获取最后添加的字段_Mysql - Fatal编程技术网

如何从MySQL数据库连接中获取最后添加的字段

如何从MySQL数据库连接中获取最后添加的字段,mysql,Mysql,我的数据库有两个表 MariaDB [testnotes]> describe contactstbl; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(6) | YES

我的数据库有两个表

MariaDB [testnotes]> describe contactstbl;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(6)      | YES  |     | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
| phone | varchar(20) | YES  |     | NULL    |       |
| email | varchar(40) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

MariaDB [testnotes]> describe notestbl;
+-----------+----------+------+-----+---------+-------+
| Field     | Type     | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| id        | int(6)   | YES  |     | NULL    |       |
| notes     | blob     | YES  |     | NULL    |       |
| dateadded | datetime | YES  |     | NULL    |       |
+-----------+----------+------+-----+---------+-------+
我需要一个查询,该查询将显示给定ID的notestbl表中的最后一个备注

contactstbl有大约100条记录,我想把它们全部显示出来,即使没有笔记

MariaDB [testnotes]> select * from contactstbl;
+------+------+-------+--------+
| id   | name | phone | email  |
+------+------+-------+--------+
|    1 | fran | 12335 | gf@g.m |
|    2 | tony | 45355 | ck@g.m |
|    3 | samm | 46545 | fs@g.m |
+------+------+-------+--------+

MariaDB [testnotes]> select * from notestbl;
+------+------------------+---------------------+
| id   | notes            | dateadded           |
+------+------------------+---------------------+
|    1 | 2 days ago notes | 2020-01-12 00:00:00 |
|    3 | 5 days ago notes | 2020-01-09 00:00:00 |
|    3 | 3 days ago notes | 2020-01-11 00:00:00 |
|    1 | 1 days ago notes | 2020-01-13 00:00:00 |
|    1 | 3 days ago notes | 2020-01-11 00:00:00 |
+------+------------------+---------------------+
5 rows in set (0.00 sec)
我试过两个不同的问题,但似乎都不正确

SELECT c.id,c.name,c.email,n.id,n.dateadded,n.notes FROM contactstbl c left join notestbl n using(id) GROUP BY c.id ORDER BY n.dateadded ASC;
非常接近

+------+------+--------+------+---------------------+------------------+
| id   | name | email  | id   | dateadded           | notes            |
+------+------+--------+------+---------------------+------------------+
|    2 | tony | ck@g.m | NULL | NULL                | NULL             |
|    3 | samm | fs@g.m |    3 | 2020-01-09 00:00:00 | 5 days ago notes |
|    1 | fran | gf@g.m |    1 | 2020-01-12 00:00:00 | 2 days ago notes |
+------+------+--------+------+---------------------+------------------+
我想看到的是:

+------+------+--------+------+---------------------+------------------+
| id   | name | email  | id   | dateadded           | notes            |
+------+------+--------+------+---------------------+------------------+
|    2 | tony | ck@g.m | NULL | NULL                | NULL             |
|    3 | samm | fs@g.m |    3 | 2020-01-11 00:00:00 | 3 days ago notes |
|    1 | fran | gf@g.m |    1 | 2020-01-13 00:00:00 | 1 days ago notes |
+------+------+--------+------+---------------------+------------------+
选择C.ID,
C.姓名,
电子邮件,
N1.ID,
N1.已添加日期,
N1.注意事项
来自CONTACTSTBL C
使用(ID)左连接NOTESTBL N1
N1.ID=N2.ID上的左连接注释stbl N2
N1.DATEADDED
也可以从这里尝试一些想法

只需在SELECT子句中使用子查询:

SELECT 
    c.id,
    c.name,
    c.email,
    (SELECT n.id FROM notestbl n WHERE n.id=c.id ORDER BY n.dateadded DESC LIMIT 1) nid,
    (SELECT n.dateadded FROM notestbl n WHERE n.id=c.id ORDER BY n.dateadded DESC LIMIT 1) ndateadded,
    (SELECT n.notes FROM notestbl n WHERE n.id=c.id ORDER BY n.dateadded DESC LIMIT 1) nnotes
FROM 
    contactstbl c 
GROUP BY c.id 
ORDER BY ndateadded ASC;
结果:

MariaDB [test]> SELECT
    ->     c.id,
    ->     c.name,
    ->     c.email,
    ->     (SELECT n.id FROM notestbl n WHERE n.id=c.id ORDER BY n.dateadded DESC LIMIT 1) nid,
    ->     (SELECT n.dateadded FROM notestbl n WHERE n.id=c.id ORDER BY n.dateadded DESC LIMIT 1) ndateadded,
    ->     (SELECT n.notes FROM notestbl n WHERE n.id=c.id ORDER BY n.dateadded DESC LIMIT 1) nnotes
    -> FROM
    ->     contactstbl c
    -> GROUP BY c.id
    -> ORDER BY ndateadded ASC;
+----+------+--------+------+---------------------+------------------+
| id | name | email  | nid  | ndateadded          | nnotes           |
+----+------+--------+------+---------------------+------------------+
|  2 | tony | ck@g.m | NULL | NULL                | NULL             |
|  3 | sam  | fs@g.  |    3 | 2020-01-11 00:00:00 | 3 days ago notes |
|  1 | fran | gf@g.m |    1 | 2020-01-13 00:00:00 | 1 days ago notes |
+----+------+--------+------+---------------------+------------------+
3 rows in set (0.07 sec)

首先,我认为您应该更改
notestbl
表的模式,因为它没有自己的id字段,而是完全依赖
contactstbl
表的id。这是一个糟糕的设计,应该正常化,以防止将来的痛苦:)

我建议将其更改为以下内容:

mysql> select * from notestbl;
+------+------------+------------------+---------------------+
| id   | contact_id | notes            | dateadded           |
+------+------------+------------------+---------------------+
|    1 |          1 | 2 days ago notes | 2020-01-12 00:00:00 |
|    2 |          3 | 5 days ago notes | 2020-01-09 00:00:00 |
|    3 |          3 | 3 days ago notes | 2020-01-11 00:00:00 |
|    4 |          1 | 1 days ago notes | 2020-01-13 00:00:00 |
|    5 |          1 | 3 days ago notes | 2020-01-11 00:00:00 |
+------+------------+------------------+---------------------+
5 rows in set (0.00 sec)
然后,您可以使用此单行查询来获得所需的结果:

select c.id, c.name, c.email, n.id, n.dateadded, n.notes from contactstbl c left join (select t1.id, t1.contact_id, t1.dateadded, t1.notes from notestbl t1, (select contact_id, max(dateadded) as maxdate from notestbl group by contact_id) t2 where t1.contact_id=t2.contact_id and t1.dateadded=t2.maxdate) n on c.id=n.contact_id;
查询的更直观的表示形式:

select  c.id, 
        c.name, 
        c.email, 
        n.id, 
        n.dateadded, 
        n.notes 
from contactstbl c 
left join   (select t1.id, 
                    t1.contact_id, 
                    t1.dateadded, 
                    t1.notes 
            from    notestbl t1, 
                    (select contact_id, max(dateadded) as maxdate from notestbl group by contact_id) t2 
            where   t1.contact_id=t2.contact_id 
                and t1.dateadded=t2.maxdate) n 
on c.id=n.contact_id;
+------+------+--------+------+---------------------+------------------+
| id   | name | email  | id   | dateadded           | notes            |
+------+------+--------+------+---------------------+------------------+
|    1 | fran | gf@g.m |    4 | 2020-01-13 00:00:00 | 1 days ago notes |
|    2 | tony | ck@g.m | NULL | NULL                | NULL             |
|    3 | samm | fs@g.m |    3 | 2020-01-11 00:00:00 | 3 days ago notes |
+------+------+--------+------+---------------------+------------------+
3 rows in set (0.00 sec)
select  c.id, 
        c.name, 
        c.email, 
        n.id, 
        n.dateadded, 
        n.notes 
from contactstbl c 
left join   (select t1.id, 
                    t1.contact_id, 
                    t1.dateadded, 
                    t1.notes 
            from    notestbl t1, 
                    (select contact_id, max(dateadded) as maxdate from notestbl group by contact_id) t2 
            where   t1.contact_id=t2.contact_id 
                and t1.dateadded=t2.maxdate) n 
on c.id=n.contact_id;