2012-03-28 68 views
1

我的服务器数据库花了太长时间才能通过单独的线程运行两个sql查询。我这样做在PHP中:一个SQL查询而不是三个sql查询

$First=mysql_query("SELECT `ID`,`Country` FROM `Users` WHERE `IP`='".$ip."'",$connection); 

$row=mysql_fetch_assoc($First); 
$id=$row['ID']; 
$ucountry=$row['Country']; 

$opt=mysql_query("SELECT Size,Paper,Zip FROM Tools WHERE (Users LIKE '%".$id."%') OR (Users LIKE '".$id."%') OR (Users LIKE '%".$id."') OR (Users LIKE '".$id."') OR (Users LIKE 'All users') OR (Country LIKE '".$ucountry."') OR (Country LIKE 'All countries')",$connection); 

如何在只有一个查询在mysql中做所有这些东西?

我尝试这样做:

SELECT (SELECT `ID` FROM `Users` WHERE `IP`='xx.xx.xx.xx' ) AS UID, (SELECT `Country` FROM `Users` WHERE `IP`='xx.xx.xx.xx' ) AS UCountry, (SELECT Size,Paper,Zip FROM Tools WHERE (Users LIKE CONCAT('%#',UID,'#%')) OR (Users LIKE CONCAT('#',UID,'#%')) OR (Users LIKE CONCAT('%#',UID,'#')) OR (Users LIKE CONCAT('#',UID,'#')) OR (Users LIKE 'All users') OR (Country LIKE UCountry) OR (Country LIKE 'All countries')) 
+4

通过将其作为一个查询,您不一定会使它更快。事实上,它通常变得更慢。 – 2012-03-28 20:00:00

+2

OR(Users LIKE'%“。$ id。”%')OR(Users LIKE'“。$ id。”%')OR(Users LIKE'%“。$ id。”')OR(Users LIKE' “。$ id。”')或(用户LIKE'所有用户')'? – 2012-03-28 20:00:31

+1

为什么每个比较都有'LIKE'? '='可能更快。 – 2012-03-28 20:03:43

回答

0

如果您需要确保只有第一行上使用您的选择从用户在你需要加入SQL被复制到内嵌查询

SELECT t.SIZE, 
     t.paper, 
     t.zip 
FROM tools t 
     INNER JOIN (SELECT `id`, 
          `country` 
        FROM `users` 
        WHERE `ip` = ? 
        LIMIT 1) u 
     ON t.Users like CONCAT('%',u.id '%') 
      OR t.user LIKE 'All users' 
      OR Country LIKE CONCAT('%',u.country '%') 
      OR Country LIKE 'All countries' 
+0

这也不错。谢谢 – Jigberto 2012-03-28 20:31:11

0

你只需要使用通配符等。您的某些LIKE似乎是多余的,因为您已经在前面和后面与%进行了匹配。

$query = "SELECT Users.ID 
      ,Users.Country 
      ,Tools.Users 
      ,Tools.Country 
      ,Tools.Size 
      ,Tools.Paper 
      ,Tools.Zip 
FROM Tools 
INNER JOIN Users 
ON Users.IP = '$ip' 
AND (
    Tools.Users LIKE CONCAT('%', Users.ID, '%') 
    OR Tools.Users = 'All users' 
    OR Tools.Country LIKE Users.Country 
    OR Tools.Country = 'All countries' 
)"; 
+0

这也是不错的....我的问题是,我从来没有使用内部连接,它确实需要我的棘手部分:) – Jigberto 2012-03-28 20:32:44

0
SELECT t.Size, t.Paper, t.Zip 
FROM Tools AS t 
INNER JOIN Users AS u 
    ON (Users LIKE CONCAT('%', u.ID, '%')) 
    OR (Users LIKE CONCAT(u.ID, '%')) 
    OR (Users LIKE CONCAT('%', u.ID)) 
    OR (Users LIKE u.ID) 
    OR (Users LIKE 'All users') 
    OR (Country LIKE u.Country) 
    OR (Country LIKE 'All countries') 
WHERE (u.IP = '$ip') 

你的一些LIKE标准是多余的,因为他们是因为前一个一定是真的。

因此,前面的查询等价于:

SELECT t.Size, t.Paper, t.Zip 
FROM Tools AS t 
INNER JOIN Users AS u 
    ON (Users LIKE CONCAT('%', u.ID, '%')) 
    OR (Users LIKE 'All users') 
    OR (Country LIKE u.Country) 
    OR (Country LIKE 'All countries') 
WHERE (u.IP = '$ip') 
+0

完美.... Skrol29最好的:) – Jigberto 2012-03-28 20:29:23

+0

如果我想只插入一行,如果以下SELECT返回一个0或没有行。 类似于: **如果(选择是0)则INSERT()** 我该如何在MYSQL中执行此操作? 我只想做一个查询,而不是这两个查询: $ r = mysql_query(“SELECT ID,Country FROM Users WHERE IP ='”。$ ip。“'”,$ connection); ($!r || mysql_num_rows($ r)<= 0) $ ir = mysql_query(“INSERT INTO Users(IP,Country)VALUES('”。$ ip。“','”。$ country “')”,$连接); – Jigberto 2012-03-28 21:30:28