2013-02-27 47 views
0

試圖找到,如果這兩個查詢具有重疊從一個表獲取兩個查詢的重疊

下面的PHP/MySQL的代碼工作,但它是笨重;兩個查詢,數據被轉換成數組,數組進行比較!

(請注意這是一個功能,因爲它返回是否有重疊)

$manager_sql = "SELECT league_id FROM league_members WHERE manager = 1 AND member_active = 1 AND player_id = $mi"; 
$player_sql = "SELECT league_id FROM league_members WHERE member_active = 1 AND player_id = $pi"; 

$manager_result = mysql_query($manager_sql) or die(mysql_error()); 
$manager_leagues = array(); 
while($sqlrow = mysql_fetch_array($manager_result)) { 
    extract($sqlrow); 
    $manager_leagues[] = $league_id; 
} 

$player_result = mysql_query($player_sql) or die(mysql_error()); 
$player_leagues = array(); 
while($sqlrow = mysql_fetch_array($player_result)) { 
    extract($sqlrow); 
    $player_leagues[] = $league_id; 
} 

$result = array_intersect($manager_leagues, $player_leagues); 

return count($result) > 0; 

這裏是在一個去做查詢一些嘗試:

(SELECT league_id FROM league_members WHERE manager = 1 AND member_active = 2 AND player_id = '$mi') 
    UNION ALL 
(SELECT league_id FROM league_members WHERE member_active = 1 AND player_id = '$pi') 

看起來工作,但返回太多行:

SELECT league_id FROM league_members WHERE league_id IN (
    SELECT league_id FROM league_members WHERE manager = 1 AND member_active = 1 AND player_id = '$mi' 
) AND league_id IN (
    SELECT league_id FROM league_members WHERE member_active = 1 AND player_id = '$pi' 
) 
+0

通過重疊,你的意思是什麼? – 2013-02-27 05:59:08

+0

如果你只是在第一個查詢中檢查'$ pi',它會是同樣的事情。 – kennypu 2013-02-27 06:02:03

+0

A $ mi管理着一堆聯賽(例如2,4,6),$ pi在一堆聯賽中打球(例如1,3,7) - 重疊比較2,4,6和1,3, 7 – sq2 2013-02-27 06:06:27

回答

0

嘗試此查詢:

$sql = "SELECT ls1.league_id FROM league_members AS ls1 
     INNER JOIN league_members AS ls2 ON ls1.league_id = ls2.league_id 
     WHERE ls1.manager = 1 AND ls1.member_active = 1 AND ls1.player_id = '".$mi."' 
     AND ls2.member_active = 1 AND ls2.player_id = '".$pi."'" 

注:

  1. mysql_ *函數deprectated,使用mysqli_ *函數或PDO
  2. 您的查詢很容易受到SQL注入,使其seccure。
+0

他的查詢不一定是脆弱的,它取決於$ mi和$ pi的數據來自哪裏。如果說,他們已經投到(int)s,那麼注射應該不成問題。但我同意這是不好的做法。 – Jason 2013-02-27 06:13:09

+0

感謝您的所有意見。 $ mi和$ pi只能是整數,因此安全。 (着名的遺言) – sq2 2013-02-27 06:16:06

+0

另一方面,僅僅因爲你認爲'$ mi'和'$ pi'只能是整數並不能實現,你必須執行這個約束。我說的是,你的應用程序今天可能還行,但隨着時間的推移,你可能會將'$ mi'和'$ pi'的來源從現在改爲不太可靠的來源,如果你避難在代碼中明確強制實施整數約束,那麼當時你可能會忘記這麼做。 – Jason 2013-02-27 14:30:05

0

你希望找到任何league_id的同時具有$mi作爲經理和$pi作爲的球員之一?

SELECT DISTINCT l.league_id FROM league_members l JOIN league_members l2 ON l.league_id = l2.league_id AND l.member_active = 1 AND l2.member_active = 1 AND l.manager = 1 AND l2.manager = 0 WHERE l.player_id = $mi AND l2.player_id = $pi; 
0

嘗試

"SELECT league_id FROM league_members WHERE manager = 1 AND member_active = 1 AND (player_id = '".$mi."' OR player_id = '".$pi."')"; 
0

請嘗試以下將它的工作。如果沒有,請讓我知道你有哪些問題。

SELECT league_id FROM league_members WHERE league_id IN( SELECT league_id FROM league_members WHERE(member_active = 1 AND(player_id = '$ MI' 或player_id = '$ PI')和管理者= 1)

0

我明顯沒有「T試過,但我建議最後查詢,與distinct關鍵字添加:

SELECT distinct league_id FROM league_members WHERE league_id IN (
    SELECT league_id FROM league_members WHERE manager = 1 AND member_active = 1 AND player_id = '$mi' 
) AND league_id IN (
    SELECT league_id FROM league_members WHERE member_active = 1 AND player_id = '$pi' 
) 
+0

這也適用 - 很高興知道我離得很近! – sq2 2013-02-27 06:15:25

0

這個怎麼

SELECT league_id 
FROM league_members 
WHERE (manager = 1 AND member_active = 1 AND player_id = $mi) OR 
     (member_active = 1 AND player_id = $pi) 
GROUP BY league_id 
HAVING COUNT(*) = 2 
+0

此查詢是否有效? – 2013-02-27 06:20:26