iT邦幫忙

0

php+mysql 如何列出尚未報名者的資料?

各位好~
我有兩個資料表: 分別為member跟 join
member:欄位如下
id name tel
101 李大明 09101111
102 李珦 09501551
103 張無忌 09601661
104 陳村明 09801771

join:欄位如下
j_no id join_time
1 101 2012/2/20
2 103 2012/2/10
3 104 2012/2/16


我可以下兩層sql語法利用將member全部列出,
在下去抓join資料表,達到這樣的效果:

[所有報名資料]
姓名 報名時間
李大明 2012/2/20
李珦 尚未報名
張無忌 2012/2/10
陳村明 2012/2/16

↑上面的語法我目前有寫出來~
但是該如何下語法列出沒有報名的呢?


↓想要達到以下效果

[直接列出尚未報名者]
姓名 報名時間
李珦 尚未報名

謝謝指教了!

4
bzbz
iT邦新手 2 級 ‧ 2012-02-21 18:05:13
最佳解答

SELECT name FROM member where not exists(
SELECT * FROM join as J WHERE J.id = member.id);

8
一級屠豬士
iT邦高手 1 級 ‧ 2012-02-21 17:33:29
<pre class="c" name="code">CREATE TABLE ithelp0221_member(
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20) NOT NULL
);

INSERT INTO ithelp0221_member(id, name) VALUES
('101','李大明'),
('102','李珦'),
('103','張無忌'),
('104','陳村明');

CREATE TABLE ithelp0221_join(
j_no INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id INT NOT NULL,
join_date DATE
);

INSERT INTO ithelp0221_join(id, join_date) VALUES
(101, '2012/2/20'),
(103, '2012/2/10'),
(104, '2012/2/16');

-------------------------
SELECT m.name AS "姓名", CASE WHEN j.join_date IS NULL THEN "尚未報名" ELSE j.join_date END AS "報名時間"
FROM ithelp0221_member m LEFT JOIN ithelp0221_join j 
ON m.id = j.id
WHERE j.join_date IS NULL;

+--------+--------------+
| 姓名 | 報名時間 |
+--------+--------------+
| 李珦 | 尚未報名 |
+--------+--------------+
6
wiseguy
iT邦超人 1 級 ‧ 2012-02-22 09:56:54

hitomitanaka 的 SQL 效率比 bzbz 的好。不過 hitomitanaka 的語法可以不必用到 case 會更快:

<pre class="c" name="code">SELECT m.name AS "姓名", if(j.join_date IS NULL,"尚未報名",j.join_date) AS "報名時間"  
FROM ithelp0221_member m LEFT JOIN ithelp0221_join j   
ON m.id = j.id  
WHERE j.join_date IS NULL;  

我要發表回答

立即登入回答