Skip to content
Advertisement

select all records and the rest

here is a simple mysqli query to select specific records from my mysql database:

foreach ($getData as $data) { {

    $sql = "SELECT * FROM `myTable` WHERE `bookid` = '".$data['ID']."' "; 
    $result = $db->query( $sql ); 
                                            
    while ($zeile = $result->fetch_object()) {  
        // DO SOMETHING                         
    }
                        
}

The question is: How can I get (best practices) all the other records, which will not be selected with this query filter?

Advertisement

Answer

Running successive, more or less identical, queries in a loop is fundamentally a bad way to do things. Create a list of $data['ID'] values you want to work with, then use one query to retrieve all the rows IN that list, and a second query to retrieve everything NOT IN that list:

Important: This code assumes that the values in $getData[]['ID'] can be trusted. i.e. they have been validated before entry to this code, or they come from a trusted source.

// Create a list:
$inList = '('.implode(',', array_column($getData, 'ID')).')';

$sqlIn = "SELECT * FROM `myTable` WHERE `bookid` IN $inList";

// run the query. Check for errors
if (($result = $db->query( $sqlIn )) === false) {
    throw new Exception($db->error); 
}
                                            
while ($zeile = $result->fetch_object()) {  
    // DO SOMETHING                         
}
                        
// Now use the same list to exclude those rows

$sqlOut = "SELECT * FROM `myTable` WHERE `bookid` NOT IN $inList";

// run the query. Check for errors
if (($result = $db->query( $sqlOut )) === false) {
    throw new Exception($db->error); 
}
                                            
while ($zeile = $result->fetch_object()) {  
    // DO SOMETHING                         
}
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement