history table
包含我试图与participation table
匹配的日期。如果日期不存在于participation table
中,那么我希望记录被删除,以便我可以输入参与数据。但我有什么不行。下面是我用什么样的破败:MySQL左连接查询不起作用
MariaDB [sotp]> describe history;
+--------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+----------------+
| historyid | int(10) unsigned | NO | PRI | NULL | auto_increment |
| amount | float | NO | | NULL | |
| subsidy | char(1) | NO | | NULL | |
| last_payment | date | NO | | NULL | |
| amount_paid | float | NO | | NULL | |
| balance | float | NO | | NULL | |
| attend | char(1) | NO | | N | |
| atend_date | date | NO | | NULL | |
| groupid | int(11) unsigned | NO | | NULL | |
| clientid | int(10) unsigned | NO | MUL | NULL | |
| memberid | int(10) unsigned | NO | MUL | NULL | |
+--------------+------------------+------+-----+---------+----------------+
MariaDB [sotp]> select clientid, attend_date
-> from history
-> where memberid = "1"
-> AND MONTH(attend_date) = "10"
-> AND YEAR(attend_date) = "2016"
-> AND attend_date <> "0000-00-00"
-> ORDER BY attend_date ASC;
+----------+-------------+
| clientid | attend_date |
+----------+-------------+
| 3 | 2016-10-11 |
| 1 | 2016-10-11 |
| 7 | 2016-10-11 |
| 2 | 2016-10-11 |
| 4 | 2016-10-11 |
| 5 | 2016-10-11 |
| 8 | 2016-10-11 |
| 9 | 2016-10-11 |
+----------+-------------+
MariaDB [sotp]> describe participation;
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| partid | int(11) | NO | PRI | NULL | auto_increment |
| notes | varchar(255) | NO | | NULL | |
| groupdate | date | NO | | NULL | |
| clientid | int(10) unsigned | NO | MUL | NULL | |
| memberid | int(10) unsigned | NO | MUL | NULL | |
+-----------+------------------+------+-----+---------+----------------+
MariaDB [sotp]> select clientid, groupdate
-> from participation
-> where memberid = "1"
-> AND MONTH(groupdate) = "10"
-> AND YEAR(groupdate) = "2016"
-> AND groupdate <> "0000-00-00"
-> ORDER BY groupdate ASC;
+----------+------------+
| clientid | groupdate |
+----------+------------+
| 2 | 2016-10-11 |
| 4 | 2016-10-11 |
+----------+------------+
而且我left join
查询:
SELECT historyid, p.groupdate, h.attend_date, h.clientid, h.memberid
FROM history AS h
LEFT JOIN participation AS p ON p.groupdate = h.attend_date
WHERE h.memberid = "1"
AND MONTH(h.attend_date) = "10"
AND YEAR(h.attend_date) = "2016"
AND h.attend_date <> "0000-00-00"
ORDER BY h.attend_date ASC;
+-----------+------------+-------------+----------+----------+
| historyid | groupdate | attend_date | clientid | memberid |
+-----------+------------+-------------+----------+----------+
| 58 | 2016-10-11 | 2016-10-11 | 3 | 1 |
| 61 | 2016-10-11 | 2016-10-11 | 2 | 1 |
| 59 | 2016-10-11 | 2016-10-11 | 1 | 1 |
| 62 | 2016-10-11 | 2016-10-11 | 4 | 1 |
| 60 | 2016-10-11 | 2016-10-11 | 7 | 1 |
| 63 | 2016-10-11 | 2016-10-11 | 5 | 1 |
| 61 | 2016-10-11 | 2016-10-11 | 2 | 1 |
| 64 | 2016-10-11 | 2016-10-11 | 8 | 1 |
| 62 | 2016-10-11 | 2016-10-11 | 4 | 1 |
| 65 | 2016-10-11 | 2016-10-11 | 9 | 1 |
| 63 | 2016-10-11 | 2016-10-11 | 5 | 1 |
| 64 | 2016-10-11 | 2016-10-11 | 8 | 1 |
| 65 | 2016-10-11 | 2016-10-11 | 9 | 1 |
| 58 | 2016-10-11 | 2016-10-11 | 3 | 1 |
| 59 | 2016-10-11 | 2016-10-11 | 1 | 1 |
| 60 | 2016-10-11 | 2016-10-11 | 7 | 1 |
+-----------+------------+-------------+----------+----------+
的groupdate
场应该是除了memberid
2和4 NULL
加上它给出了数据的两倍。我究竟做错了什么?
此致敬礼。
UPDATE
每kasparg
要求:
MariaDB [sotp]> select *
-> from participation;
+--------+-----------------------------------------------+------------+----------+----------+
| partid | notes | groupdate | clientid | memberid |
+--------+-----------------------------------------------+------------+----------+----------+
| 824 | aaaaaaaaaaaaaaaaaaaaaazzzzzzzzzzzzzzzzzzzzzzz | 2016-01-26 | 3 | 1 |
| 825 | lol hahaha and stuff | 2016-01-26 | 4 | 1 |
| 826 | aaaaaaaaaaaaaaaaaaaaaa | 2016-01-26 | 2 | 1 |
| 827 | zzzzzzzzzzzzzzaaaaaaaaaaaaaaaaaa | 2016-01-26 | 1 | 1 |
| 828 | llllllllllllllllllllllllllllllllllll | 2016-01-28 | 3 | 1 |
| 829 | bbbbbbbbbbbbbbbbbbb | 2016-01-28 | 1 | 1 |
| 830 | Absent | 2016-01-28 | 4 | 1 |
| 831 | Absent | 2016-01-28 | 2 | 1 |
| 832 | llllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk | 2016-01-29 | 5 | 1 |
| 833 | xxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzz | 2016-01-29 | 4 | 1 |
| 834 | xxxxxxxxxxxxxxxxxxxxxxxx | 2016-01-29 | 2 | 1 |
| 835 | ccccccccccccccccccccccc | 2016-01-29 | 1 | 1 |
| 836 | llllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk | 2016-01-29 | 3 | 1 |
| 1063 | zzzzzzzzzzzzzzzzzzzzzzzzzzzz | 2016-01-30 | 3 | 1 |
| 1064 | ddddddddddddddddddddddddd | 2016-01-30 | 1 | 1 |
| 1065 | No entry made. | 2016-01-30 | 4 | 1 |
| 1066 | No entry made. | 2016-01-30 | 2 | 1 |
| 1075 | 2016-02-26: car wreck | 2016-10-11 | 2 | 1 |
| 1076 | 2016-02-26: broken legs | 2016-10-11 | 4 | 1 |
+--------+-----------------------------------------------+------------+----------+----------+
UPDATE
MariaDB [sotp]> SELECT historyid, p.groupdate, h.attend_date, p.clientid, h.clientid, h.memberid
-> FROM history AS h
-> LEFT JOIN participation AS p ON p.groupdate = h.attend_date and p.clientid = h.clientid
-> WHERE h.memberid = "1"
-> AND h.clientid = "1"
-> AND MONTH(h.attend_date) = "10"
-> AND YEAR(h.attend_date) = "2016"
-> AND h.attend_date <> "0000-00-00"
-> AND p.groupdate = "NULL"
-> ORDER BY h.attend_date ASC;
Empty set, 1 warning (0.00 sec)
我硬编码h.clientid = "1"
,仍然什么也得不到。并且该记录应为groupdate
返回一个NULL
值。
可以显示什么是参与表里面? SELECT * FROM参与限制10; – kasparg