一个SQL查询而不是三个SQL查询

时间:2012-03-28 19:58:24

标签: mysql

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

$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'))

3 个答案:

答案 0 :(得分:0)

你只需要使用通配符。你的一些喜欢似乎是多余的,因为你已经在正面和背面与%匹配。

$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'
)";

答案 1 :(得分: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' )

答案 2 :(得分: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'