0

I have a table like this:

// mytable
+----+---------+------------+
| id | id_post | code_table |
+----+---------+------------+
| 1  | 34523   | 1          |
| 2  | 3453    | 4          |
| 3  | 43434   | 2          |
| 4  | 54321   | 1          |
| 5  | NULL    | NULL       |
| 6  | 32411   | 2          |
| 7  | 42313   | 1          |
| 8  | 34242   | 2          |
+----+---------+------------+
//                    ^ all of my focus is on this column

Also I have this array:

$convert_code_name = array (
                        "1" => "Post1", 
                        "2" => "Post2", 
                        "3" => "Post3",
                        "4" => "Post4"  
                           );

Now I want to create this:

$query = "select * from post1
             union all
          select * from post2
             union all
          select * from post4";

          // there isn't "post3", because 3 isn't exist in the code_table column

How can I do that?


Here is my try:

// connect to database
$stm = $db->prepare('select * from mytable');
$stm->execute();
$result = $stm->fetch();

/* array_unique: removes duplicate values
   array_filter: removes "NULL" values */

array_filter(array_unique($result[code_table]), function($item) {
    return $item != 'NULL';
});

foreach($item as $numb){
    $query .= 'select * from'.$convert_code_name[$numb].'union all';
}

But I don't know why my code doesn't work, How can I do that?

4
  • 1
    I think you just want an in list. Commented Dec 30, 2015 at 22:34
  • array_filter returns a new array, you need to assign it to a variable. Commented Dec 30, 2015 at 22:50
  • $result just contains the first row of the table. Did you mean to use fetchAll? Commented Dec 30, 2015 at 22:51
  • @Barmar honestly I don't know, maybe I need to fetchAll .. I just understand (so far) it is better to I use DISTINCT (mysql layer) instead of array_unique() (php layer) Commented Dec 30, 2015 at 22:51

3 Answers 3

3

First, use SELECT DISTINCT in the query to get unique values, so you don't need to call array_unique.

Then, once you have all the values, you can use implode to connect all the SELECT queries with UNION ALL.

$stm = $db->prepare("SELECT DISTINCT code_table FROM mytable WHERE code_table IS NOT NULL");
$stm->execute();
$results = $stm->fetchAll();
// This returns a 2-dimensional array, we just want one column
$results = array_column($results, 'code_table');

$query = implode(' UNION ALL ', array_map(function($code_table) use ($convert_code_name) {
    return "SELECT * FROM " . $convert_code_name[$code_table];
}, $results));
Sign up to request clarification or add additional context in comments.

16 Comments

Oh Dear Lord ...! I don't know what should I say .. Perfect. +1
Well I'm embarrassed to ping you again, but ..., Look your code seems completely correct. But I don't know why it doesn't execute ..! My php version is old (5.2.6). I think array_map(function($code_table) part has a problem with my php version. Is there any alternative?
You have to use create_function in that old version. Exercise for the reader, I don't have time to show it.
It also doesn't have array_column, that's from PHP 5.5. Read the documentation for a shim.
Sorry about that -- added WHERE code_table IS NOT NULL to the query now.
|
1
$query .= 'select * from'.$convert_code_name[$numb].'union all';

will generate wrong sql, change it to (I assume that $convert_code_name[$numb] contains full table name like Post1, Post2):

$query = '';
foreach($item as $numb){
    $query .= ($query!=''?' union all ':'') . 'select * from '.$convert_code_name[$numb];
}

2 Comments

Can you please tell me how can I don't select NULL values in the query?
@stack where field is not null
0

You simply need to first execute this query:

SELECT DISTINCT code_table FROM events

Then you can build your second query like from its result, which only contains 1 row for each existing code_table.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.