skip to Main Content

I am using WordPress, and I need to create a function to check for typos in a custom table, by comparing the single values with a comparison table. The values to be checked are animal species names, and they stored as follows in table A

id | qualifying_species
----------------------
1  | Dugong dugon, Delphinus delphis
2  | Balaneoptera physalus, Tursiops truncatus, Stenella coeruleoalba

etc.

These values must be checked for typos by matching them with table B which contains a simple list of species name as a reference

id | species_name
----------------------
1  | Dugong dugon 
2  | Delphinus delphis
3  | Balaneoptera physalus
4  | Tursiops truncatus
5  | Stenella coeruleoalba

Here’s the code I prepared

function test(){
global $wpdb;
$query_species = $wpdb->get_results("SELECT qualifying_species FROM A", ARRAY_A);

                    foreach($query_species as $row_species)
                    {
                        $string = implode (";", $row_species);
                        $qualifying_species = explode(";", $string);

                        //echo '<pre>';
                        //print_r($qualifying_species);
                        //echo '</pre>';

                        foreach ($qualifying_species as $key => $value) {
                            //I get here the single species name
                            echo $value . '<br>';
                                //I compare the single name with the species list table
                                $wpdb->get_results("SELECT COUNT(species_name) as num_rows FROM B WHERE species_name = '$value'");
                                    //if the species is written correctly, it will be counted as 1 with num_rows
                                    //if the species is written wrongly, no match will be found and num_rows = 0 
                                    echo $wpdb->num_rows . '<br>';
                        }
                    } 
}

The echo was to check the results of the function. The Mysql query works when I do it on PHPMyAdmin, but it seems that something is wrong with the PHP loop that I wrote. For each $value echoed I have a result of 1 echoed with $wpdb->num_rows even if $value presents typos or doesn’t exist in table B

What am I doing wrong?

2

Answers


  1. You maybe could do this in the same query :

    SELECT *
    FROM table_a
    INNER JOIN table_b ON FIND_IN_SET(species_name,replace(qualifying_species,';',','))
    

    if you want to find non-existent values, use something like this:

    SELECT *
    FROM table_b
    LEFT OUTER JOIN table_a ON FIND_IN_SET(species_name,replace(qualifying_species,';',','))
    WHERE table_a.id IS null
    
    Login or Signup to reply.
  2. Possible solutoin for MySQL 5.7.

    Create a procedure (must be performed only once):

    CREATE PROCEDURE check_table_data ()
    BEGIN
    DECLARE sp_name VARCHAR(255);
    DECLARE done INT DEFAULT FALSE;
    DECLARE cur CURSOR FOR SELECT species_name FROM tableB;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;
    OPEN cur;
    CREATE TEMPORARY TABLE t_tableA SELECT * FROM tableA;
    FETCH cur INTO sp_name;
    REPEAT
        UPDATE t_tableA SET qualifying_species = REPLACE(qualifying_species, sp_name, '');
        FETCH cur INTO sp_name;
    UNTIL done END REPEAT;
    CLOSE cur;
    SELECT id, qualifying_species wrong_species FROM t_tableA WHERE REPLACE(qualifying_species, ',', '') != '';
    DROP TABLE t_tableA;
    END
    

    Now, when you need to check your data for unknown species and misprintings you simply execute one tiny query

    CALL check_table_data;
    

    which will return id for a row which have a species value not found in tableB, and this species itself.

    fiddle

    The code assumes that there is no species_name value which is a substring of another species_name value.


    The procedure do the next: it makes the data copy then removes existent species from the values. If some species is wrong (is absent, contains misprint) it won’t be removed. After all species processed the procedure selects all rows which are not empty (contain non-removed species).

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search