skip to Main Content

I am creating a dashboard where a user can see their form submissions and no one else’s submissions.

The database looks like this:

        db_frm_item_metas
| meta_value | field_id | item_id |
-----------------------------------
|     90     |    57    |   33    |
|     01     |    56    |   33    |
|   100000   |    58    |   33    |
|     90     |    57    |   34    |
|     01     |    56    |   34    |
|   100001   |    58    |   34    |
|     91     |    57    |   35    |
|     01     |    56    |   35    |
|   100000   |    58    |   35    |
|     90     |    57    |   36    |
|     01     |    56    |   36    |
|   100002   |    58    |   36    |
-----------------------------------

The numbers 90 and 91 are id’s assigned to the company and are dictated by field_id 57. The user within the company is dictated by field_id 56. Finally, the form number is field_id 58. Each form that is submitted is grouped by item_id.

I think the problem is with the MySQL query. I think it is too specific and isn’t taking the form submission into account.

    $formID = "SELECT * FROM db_frm_item_metas WHERE field_id = 58 ORDER BY meta_value DESC";
    $results = $wpdb->get_results($formID);
        
    foreach ($results as $result){      
        echo '<span class="formItem" style="float: left; clear: left; margin-bottom: 20px;"><p class="formNumber">' . $companyID . "-"  . $userID . "-". $result->meta_value . '</p>' . $getFormItemID . ' ' . $result->item_id . ' </span>';
        }

If I remove "WHERE field_id = 58" from the query, how do I return that value within the loop? Or should I be looping through multiple MySQL queries, if that’s possible in one loop?

The ideal solution is to print the values like the following for user 90-01:

<p>90-01-100002</p>
<p>90-01-100001</p>
<p>90-01-100000</p>

and for user 91-01:

<p>91-01-100000</p>

I am very new to PHP and don’t understand the syntax well. Please be considerate.

2

Answers


  1. Try this SQL:

    SELECT 
        t1.meta_value AS t1_value, 
        t2.meta_value AS t2_value, 
        t3.meta_value AS t3_value
    FROM db_frm_item_metas AS t1
    INNER JOIN db_frm_item_metas AS t2
        USING (item_id)
    INNER JOIN db_frm_item_metas AS t3
        USING (item_id)
    WHERE 
        t1.field_id = 57
        AND t2.field_id = 56
        AND t3.field_id = 58
    
    Login or Signup to reply.
  2. CREATE TABLE db_frm_item_metas (
      `meta_value` varchar(10),
      `field_id` varchar(10),
      `item_id` varchar(10)
    );
    
    INSERT INTO db_frm_item_metas
      (`meta_value`, `field_id`, `item_id`)
    VALUES
      ('90', '57', '33'),
      ('01', '56', '33'),
      ('100000', '58', '33'),
      ('90', '57', '34'),
      ('01', '56', '34'),
      ('100001', '58', '34'),
      ('91', '57', '35'),
      ('01', '56', '35'),
      ('100000', '58', '35'),
      ('90', '57', '36'),
      ('01', '56', '36'),
      ('100002', '58', '36');
    
    SELECT 
        MAX(IF(`field_id` = 57,`meta_value`, '')) mv1,
        MAX(IF(`field_id` = 56,`meta_value`, '')) mv2,
        MAX(IF(`field_id` = 58,`meta_value`, '')) mv3
    FROM db_frm_item_metas
    GROUP BY `item_id`
    HAVING mv1 = '90' AND mv2 = '01'
    
    mv1 | mv2 | mv3   
    :-- | :-- | :-----
    90  | 01  | 100000
    90  | 01  | 100001
    90  | 01  | 100002
    

    db<>fiddle here

    your code would them look like

    $results = $wpdb->get_results(
      $wpdb->prepare(
        "
         SELECT 
             MAX(IF(`field_id` = 57,`meta_value`, '')) mv1,
             MAX(IF(`field_id` = 56,`meta_value`, '')) mv2,
             MAX(IF(`field_id` = 58,`meta_value`, '')) mv3
         FROM db_frm_item_metas
         GROUP BY `item_id`
         HAVING mv1 = %s AND mv2 = %s    ",
        array( '90',  '01' )
      )
    );
    
    if ( $results ) {
      foreach ( $results as $result) {
            echo '<span class="formItem" style="float: left; clear: left; margin-bottom: 20px;"><p class="formNumber">' . . $result->mv1 . . "-"  . $result->mv2 . "-". $result->mv3 . '</p>' . ' </span>';
      }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search