iT邦幫忙

0

php+mysql 查詢2張表 彼此有關連性 (join)

請問該如何下sql語法,
才可以查詢跟ASP有關聯的[posts]資料表之title:
=>當輸入ID=3,會到tags_relation資料表抓出 tag_id=3
(slect * form tags_relation where tag_id=3)
=>查到[tags_relation]資料表中有符合的post_id有:74、75
=>再到[posts]資料表查出ID=74 的 title是HELLO1
查出ID=75 的 title是HELLO2

得到一開始的想知道誰會ASP,分別是HELLO1跟HELLO2這樣~~

posts:

ID  title
74  HELLO1
75  HELLO2
76  HELLO3

tags:

ID  tag
3   ASP
61  PHP
62  JSP
63  COMCOB

tags_relation:

post_id|tag_id
74       3
74       61
75       3
75       62
75       63

可用雙SQL達到此效果的語法,希望可簡化成單一SQL

$ID='3';
$loop = mysql_query("slect post_id form tags_relation where tag_id=$ID");
while ($row = mysql_fetch_array($loop)){
	$ID=$row['post_id'];
	$result = db_query("slect * form posts where ID=$ID ","");
	$row2 = mysql_fetch_assoc($result);
	echo $row2['title'];//標題
}
16
一級屠豬士
iT邦高手 1 級 ‧ 2014-03-17 15:59:32
最佳解答
<pre class="c" name="code">CREATE TABLE posts (
id TINYINT UNSIGNED NOT NULL PRIMARY KEY,
title CHAR(6) NOT NULL
);

INSERT INTO posts(id, title) VALUES
(74, 'Hello1'),(75, 'Hello2'),(76, 'Hello3');

CREATE TABLE tags (
id TINYINT UNSIGNED NOT NULL PRIMARY KEY,
tag CHAR(6) NOT NULL
);

INSERT INTO tags(id, tag) VALUES
(3, 'ASP'), (61, 'PHP'), (62, 'JSP'), (63, 'COMCOB');

CREATE TABLE tags_relation (
post_id TINYINT UNSIGNED NOT NULL,
tag_id TINYINT UNSIGNED NOT NULL
);

INSERT INTO tags_relation(post_id, tag_id) VALUES
(74, 3),(74, 61),(75, 3),(75, 62),(75, 63);

SELECT p.title
  FROM tags t
     , tags_relation r
     , posts p
 WHERE t.tag = 'ASP'
   AND t.id = r.tag_id
   AND r.post_id = p.id;

+--------+
| title  |
+--------+
| Hello1 |
| Hello2 |
+--------+
10
老鷹(eagle)
iT邦高手 1 級 ‧ 2014-03-17 15:30:39

老鷹斗膽解答,答錯了不要拿彈弓射老鷹
看到樓主這樣寫,讓老鷹想到JOIN + WHERE
情境模式-訂貨廠商查詢
老鷹製作三張資料表
A table
ID
姓名

B table
ID
廠商

C table
ID
廠商ID
姓名ID

要查一個叫做王小明 的廠商列表
老鷹會這樣下SQL

<pre class="c" name="code">
SELECT * FROM `A`,`B`,`C` WHERE C.廠商ID = B.ID AND C.姓名ID=A.ID  AND A.姓名="王小明"

這樣就可發現原來小明的腿是被這些廠商打斷的失神

如有講錯 歡迎指正

player iT邦大師 1 級 ‧ 2014-03-17 18:19:39 檢舉

個人不建議用 from 後面寫多個資料表
因為這樣串起來的結果是 INNER JOIN

個人建議改用LEFT JOIN
這樣才比較不會因為資料對不起來, 而查詢時漏失掉

<pre class="c" name="code">
select * from `A`
left join `B` on C.姓名ID = A.ID
left join `C` on C.廠商ID = B.ID
where A.姓名="王小明"  

這樣事先從Table A抓篩選的資料, 在分別把在Table BC的資料串上去

player iT邦大師 1 級 ‧ 2014-03-17 18:21:59 檢舉
<pre class="c" name="code">
select A.*, B.*, C.* from `A`  
left join `B` on C.姓名ID = A.ID  
left join `C` on C.廠商ID = B.ID  
where A.姓名="王小明"   

讚

12
丁丁 (Dean)
iT邦大師 6 級 ‧ 2014-03-17 15:33:46

偷懶式 join

<pre class="c" name="code">
SELECT	b.title
FROM	tags_relation as a, posts as b
WHERE	a.post_id = b.post_id
AND		tag_id=$ID"

我要發表回答

立即登入回答