2016-05-13 6 views
0

so habe ich derzeit eine Datenbanktabelle, wo ich versuche, alle Datensätze auswählen, mit Ausnahme von denen, die in einem Array, die ich gemacht habe enthalten sind. Wie einiger Hintergrundkontext:MySQL, PHP: Wählen Sie * aus der Tabelle, wo ID nicht in Array ist

Die Struktur der Datenbanktabelle in Frage:

server_status: 
id int(11) 
server_id int(11) 
time_checked datetime 
status char(1) 

Mein PHP-Skript, um die Daten in den Hash sieht wie folgt zu erhalten:

$sql2 = "SELECT server_id, time_checked,id from server_status where time_checked<'$date' order by server_id;"; 
$result2=$conn->query($sql2); 
while($row2 = $result2->fetch_assoc()){ 

$server_id = $row2['server_id']; 
$id = $row2['id']; 
$dt = $row2['time_checked']; 

$year = substr($dt,0,4); 
$month = substr($dt,5,2); 
$day = substr($dt,8,2); 

$day = "$year-$month-$day"; 

$all[$server_id][$day] = $id; // ARRAY 

} 

Also, was ich Ich versuche, eine MySQL-Abfrage zu erstellen, die die IDs ($ ID) aus dem Array einliest und * APART daraus auswählt. Wenn ich nachdenke, scheint es, als müsste ich eine "where not" -Klausel verwenden, aber ich weiß nicht, wie ich auf den Hash-Code verweisen soll.

weitere Klarstellung: ich jetzt ein Array haben, die Daten extrahiert, die wie folgt aussieht:

1{ 
2016-05-05 : 252 
2016-05-10 : 406 
2016-04-27 : 141 
2016-05-04 : 164 
2016-05-09 : 263 
2016-05-03 : 153 
2016-04-26 : 131 
2016-04-14 : 1 
2016-04-18 : 31 
2016-04-21 : 111 
2016-04-20 : 61 
2016-04-19 : 51 
2016-04-15 : 21 
2016-04-25 : 121 
} 
2{ 
2016-05-10 : 452 
2016-05-05 : 198 
2016-05-09 : 264 
2016-05-04 : 165 
2016-04-26 : 132 
2016-04-27 : 143 
2016-04-25 : 122 
2016-04-21 : 112 
2016-05-03 : 154 
} 

ich die IDs aus diesem Array (zB 154) zu übernehmen wollen und alles in der Tabelle auswählen, die nicht der Fall ist habe eine der oben genannten IDs. Ich hoffe das hilft zu klären ?!

Jede Hilfe wird sehr geschätzt!

+0

Wie nennt man * Hash *? – Alex

+0

'$ all [$ server_id] [$ day] = $ id;' tut mir leid, ich glaube, ich benutze die Terminologie meines Chefs! : P in PHP kann es als ein mehrdimensionales Array bekannt sein? Aber ich dachte, dass es durch seine eckigen Klammern als Hash erkannt wurde. – dplatt

+0

?? Es gibt kein Hash. und mit dieser Erklärung wurde Ihr Ziel noch unklar – Alex

Antwort

0

LÖSEN:

$sql2 = "SELECT server_id, time_checked,id from server_status where time_checked<'$date' order by server_id;"; 
$result2=$conn->query($sql2); 
while($row2 = $result2->fetch_assoc()){ 


while($row2 = $result2->fetch_assoc()){ 
    $server_id = $row2['server_id']; 
    $id = $row2['id']; 
    $dt = date('Y-m-d', strtotime($row2['time_checked'])); 
    $all[$server_id][$dt] = $id; // ARRAY 
} 
} 

$stack = array(); 
    $keys = array_keys($all); 
    for($i = 0; $i < count($all); $i++) { 
     foreach($all[$keys[$i]] as $key => $value) { 
     array_push($stack, $value); 
     } 
    } 


$ids = join(',',$stack); 
$sql = "SELECT * FROM server_status WHERE time_checked<'$date' AND id NOT IN ($ids)"; 
$result=$conn->query($sql); 
echo "Server status data has been deleted.<br>"; 

ein weiteres Array aus der mehrdimensionales Array Erstellt nur die IDs zu speichern und sie nicht in Gebrauch wie John Green vorgeschlagen.

Danke!

0

Ich denke, Sie wollen nur ein NICHT IN, oder?

$sql2 = "SELECT id, server_id, time_checked,id 
     FROM server_status 
     WHERE 
      id NOT IN (".implode(',', $id_array)." 
      AND time_checked<'$date' 
     ORDER BY server_id;"; 

$result2=$conn->query($sql2); 

while($row2 = $result2->fetch_assoc()){ 
    $server_id = $row2['server_id']; 
    $id = $row2['id']; 
    $dt = date('Y-m-d', strtotime($row2['time_checked'])); 
    $all[$server_id][$dt] = $id; // ARRAY 

} 
+0

Wie würde ich $ id_array bitte definieren? :) – dplatt

+0

ein PHP-Array von IDs. Wenn Ihre IDs numerisch sind, so etwas wie $ id_array = array (1,5,12,24,33); –

1

Bei $all ist das Array, das Sie von den unerwünschten ids extrahieren möchten, das sein könnte, was Sie nach dem Code benötigen Sie zur Verfügung gestellt:

$ids_to_exclude = array(); 

// iterate through servers 
foreach ($all as $server_id => $dates) { 
    // iterate through dates of each server 
    foreach ($dates as $date => $id) { 
     // If a value is not in the array, add it. 
     // In case ids don't repeat, you won't need this if 
     if (!in_array($id, $ids_to_exclude)) { 
      // add $id to the array 
      $ids_to_exclude[] = $id; 
     } 
    } 
} 

$sql_condition = "where `id` not in (".implode(",",$ids_to_exclude).")"; 

Nur vorsichtig sein, wenn Abfragen mit String-Verkettung schreiben . Lesen Sie über SQL Injection und wie man es verhindert. Verwenden Sie Prepared Statements anstelle der reinen Verkettung.

Verwandte Themen