2014-03-06 66 views
1

我是MySQL和PHP的新手,我來自OO背景,試圖圍繞SQL查詢來包裝頭,這有點令人沮喪。現在我試圖在給定用戶ID和類別的同一表中找到所有匹配的ID。MySQL加入澄清

下面是我試圖回答的問題:給定用戶A和類別X,還有哪些其他用戶在類別X中與用戶A具有相同的興趣以及這些興趣是什麼?

下面的代碼我到目前爲止:

CREATE TEMPORARY TABLE IF NOT EXISTS t_int_map AS (
SELECT intmap.fb_id, intmap.interest_id 
FROM interest_map AS intmap 
INNER JOIN interests AS i ON intmap.interest_id = i.id 
WHERE intmap.fb_id = <ID of User A> AND i.category = '<Category User A selects'); 

SELECT im.fb_id, im.interest_id, i.name 
FROM interest_map AS im 
INNER JOIN interests AS i ON im.interest_id = i.id 
INNER JOIN t_int_map AS t_ 
WHERE t_.interest_id = im.interest_id 

這是給我所有利益用戶A的結果集具有在X類以及誰擁有匹配其他用戶該類別下的利益。我想放棄所有不與其他用戶共享的興趣。 IE:如果用戶A在X類下有10個利益,並與用戶B共享2個利益,我想只看到包含共享興趣的行(所以總共有6行,3對於用戶A,對於B爲2,對於C爲1)。

最好的做法是創建一個像這樣的臨時表,還是有更好的方法來做到這一點?我寧願不創建一個臨時表,但我無法獲得一個子選擇查詢來工作,該子選擇返回多於一行。任何和所有的建議非常感謝,謝謝!

回答

1

我不認爲你需要使用臨時表。您可以使用單個選擇語句。下面的查詢獲取指定類別的所有interest_map和interest記錄,並使用EXISTS將結果限制爲指定用戶的興趣。

請參見:http://dev.mysql.com/doc/refman/5.6/en/exists-and-not-exists-subqueries.html

DROP TABLE IF EXISTS interest_map; 

DROP TABLE IF EXISTS interests; 



CREATE TABLE interests 
(
    interest_id INT NOT NULL PRIMARY KEY 
    , category VARCHAR(25) NOT NULL 
    , description VARCHAR(50) NOT NULL 
); 

CREATE TABLE interest_map 
(
    fb_id VARCHAR(10) NOT NULL 
    , interest_id INT NOT NULL 
    , CONSTRAINT FOREIGN KEY (interest_id) REFERENCES interests (interest_id) 
    , CONSTRAINT PRIMARY KEY (fb_id , interest_id) 
); 


INSERT INTO interests (interest_id, category, description) 
VALUES 
    (1, 'Programming', 'Java') 
    ,(2, 'Programming', 'PHP') 
    ,(3, 'Programming', 'C#') 
    ,(4, 'Database', 'Oracle') 
    ,(5, 'Database', 'MySQL') 
    ,(6, 'Database', 'DB2') 
    ,(7, 'Operating System', 'Linux') 
    ,(8, 'Operating System', 'Windows'); 


INSERT INTO interest_map (fb_id , interest_id) 
VALUES 
    ('User A', 1) 
    ,('User A', 3) 
    ,('User B', 1) 
    ,('User B', 5) 
    ,('User B', 2) 
    ,('User B', 7) 
    ,('User C', 1) 
    ,('User C', 3) 
    ,('User C', 4) 
    ,('User C', 7); 


SET @user = 'User A'; 
SET @category = 'Programming'; 

SELECT 
    m.fb_id 
    , i.interest_id 
    , i.description 
FROM interests AS i 
    INNER JOIN interest_map AS m 
     ON (i.interest_id = m.interest_id) 
WHERE i.category = @category -- get interests in this category 
    AND EXISTS (
      SELECT * 
      FROM interest_map AS m2 
      WHERE m2.fb_id = @user 
       AND m2.interest_id = m.interest_id 
     ) -- the exists clause limits results to interests of the specified user 
ORDER BY m.fb_id, i.description; 
+0

謝謝!我正在研究使用變量作爲另一個潛在的解決方案,我在臨時中只有臨時表解決方案。現在我只需要修改它並轉換成PHP。 –