2013-02-27 50 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