Gobbly php到可用的SQL


Gobbly php to usable SQL?

所以我需要帮助将PHP转换为SQL。这是当前的代码(不是我的),它运行了三个while循环,最终需要大约两分钟半的时间才能运行。显然,效率不是很高。我也知道这是旧的mysql用法,而不是新的mysqli或PDO版本。。

以下是样本数据的小提琴:

http://sqlfiddle.com/#!2/71c74

查看php,我认为这就是查询(使用SQL)。

SELECT z.siteID, us.id FROM groups g, usertogroup u, users z, usertosite us 
WHERE g.entityID=$thisEntity
and u.groupID=2093 and z.id=userID
and site_id=3411  and user_id=$uid;

(替换为实际值)。

但是,当查询应该只返回44行时,它会返回1000多行。这就是PHP,有人知道真正的查询应该是什么样子的吗,或者用PHP写这个的更好的方法吗?$uid是从超全局$_SESSION变量中提取的,因此它已被设置。与$thisEntity相同,也是从会话变量中提取的。

$site_list3 = array();
$sql_str = "SELECT id FROM groups WHERE entityID=$thisEntity";
$sql_res = mysql_query($sql_str);
$row = mysql_fetch_array($sql_res, MYSQL_ASSOC);

while ($row) {
    $passed = 1;
    $sql_str2 = "SELECT siteID FROM usertogroup u,users z where groupID=" . $row['id'] . " and z.id=userID;"; 
    $sql_res2 = mysql_query($sql_str2);
    $row2 = mysql_fetch_array($sql_res2, MYSQL_ASSOC);    
    while ($row2) {
        if ($thisEntity == 1761 && $row2['siteID'] == 3411) {
        } else {
            $sql_str3 = "SELECT id FROM usertosite WHERE site_id=" . $row2['siteID'] . " and user_id=$uid";
            $sql_res3 = mysql_query($sql_str3);
            $row3 = mysql_fetch_array($sql_res3, MYSQL_ASSOC);
            if (!$row3)
                $passed = 0;
        }
        $row2 = mysql_fetch_array($sql_res2, MYSQL_ASSOC);
    }
    if ($passed == 1)
    {
        $site_list3[] = (int) $row['id'];
    }

    $row = mysql_fetch_array($sql_res);


}
$site_list3_values = implode(", ", $site_list3);

看起来缺少一个或多个JOIN子句。如果没有一个有效的模式,我只能猜测。。。但这行得通吗?

SELECT
  U.siteID,
  US.id
FROM
  groups G
  JOIN usertogroup UG ON(UG.groupID=G.id) -- was missing?
  JOIN users U ON(U.id=U.userID)
  JOIN usertosite US ON(US.user_id=U.id) -- was missing?
WHERE
  G.entityID = 12345
  AND US.site_id = ABCDEF
  AND ....

在可能的情况下,我个人更喜欢"ON"条件而不是"Where"表达式,因为我认为这会使表之间的关系更加明显。