2012-03-28 5 views
1

Meine Server-Datenbank dauerte zu lange, um zwei SQL-Abfragen durch separate Thread auszuführen. Ich mache so in PHP:Eine SQL-Abfrage anstelle von drei SQL-Abfragen

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

Wie in all dieses Zeug in Mysql zu tun, nur eine Abfrage?

Ich versuchte dies:

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

Indem Sie es eine Abfrage machen, werden Sie es nicht unbedingt schneller machen. Tatsächlich wird es oft langsamer. –

+2

Warum '(Benutzer mögen '%". $ ID. "%') ODER (Benutzer wie '". $ ID. "%') ODER (Benutzer wie '%". $ ID. "') ODER (Benutzer wie ' ". $ id." ') ODER (Benutzer wie' Alle Benutzer ') '? –

+1

Auch warum 'LIKE' für jeden Vergleich? '=' ist wahrscheinlich schneller. –

Antwort

0

Wenn Sie müssen sicher sein, dass nur die erste Zeile auf Ihrer Auswahl von Benutzern verwendet wird in der SQL repliziert werden Sie brauchen, um JOIN zu einer Inline-Abfrage

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

das ist auch gut. Vielen Dank – Jigberto

0

Sie nur mit Wildcards LIKE muss. Einige Ihrer LIKE scheinen überflüssig zu sein, da Sie bereits mit% auf Vorder- und Rückseite übereinstimmen.

$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

das ist auch gut .... mein Problem war, dass ich nie inneren Join verwendet habe, tut es den kniffligen Teil, den ich brauche :) – Jigberto

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

Einige Ihrer LIKE Kriterien sind überflüssig, da sie wegen der vorherigen notwendigerweise wahr sind.

Daher ist die vorherige Abfrage entspricht:

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

Perfekt .... Skrol29 das Beste :) – Jigberto

+0

Wenn ich nur eine Zeile einfügen möchte, Wenn das folgende SELECT eine 0 oder keine Zeilen zurückgibt. Etwas wie: ** IF (AUSWAHL IST 0) DANN INSERT() ** Wie kann ich dies in MYSQL tun? Ich möchte nur eine Abfrage anstelle dieser zwei Abfragen: $ r = mysql_query ("SELECT ID, Land von Benutzern WHERE IP = '". $ Ip. "'", $ Verbindung); if ($ r || mysql_num_rows ($ r) <= 0) $ ir = mysql_query ("INSERT INTO Benutzer (IP, Land) VALUES ('". $ Ip. "', '". $ Country) . "')", $ Verbindung); – Jigberto