繁体   English   中英

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

[英]One SQL query instead of three sql queries

我的服务器数据库花了太长时间,无法通过单独的线程运行两个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'))

您只需要使用通配符即可。 您的某些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'
)";
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' )

如果需要确保从用户中选择的第一行仅用于复制到SQL中,则需要JOIN到内联查询

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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM