I have a table with two fields, inbound and outbound, both of which are text values. I want to get all a count of all instances of a specific value in either or both of those columns. 
Here’s an example of the schema with some values and my query:
CREATE TABLE widgets (
  id int(5) auto_increment,
  inbound varchar(200),
  outbound varchar(200),
  event_name varchar(255),
  start_time int(11),
  primary key(id)
  );
  INSERT INTO widgets values (NULL, 'my_widget', 'other_widget', 'STARTED', unix_timestamp());
  INSERT INTO widgets values (NULL, 'my_widget', 'my_widget', 'STARTED', unix_timestamp());
  INSERT INTO widgets values (NULL, 'my_widget', 'my_widget', 'STARTED', unix_timestamp());
SELECT count(*)
            FROM (
                SELECT inbound, outbound, event_name
                FROM `widgets`
                ORDER BY `start_time` DESC
                LIMIT 10000
            ) AS t
            WHERE
              (t.`inbound` = 'my_widget'
                OR
                t.`outbound` = 'my_widget'
              )
            AND event_name != 'FINISHED'
Here’s an SQL fiddle with the schema and my current query
Currently I’m getting a count of 3 appearances of my_widget, however I want to count all 5 appearances of my_widget
Advertisement
Answer
You can do something like this with case statement, here is the demo.
select
  sum(total) as total
from
(
  select
    sum(case when inbound = 'my_widget' then 1 else 0 end) as total
  from widgets
  where event_name <> 'FINISHED'
  union all
  select
    sum(case when outbound = 'my_widget' then 1 else 0 end) as total
  from widgets
  where event_name <> 'FINISHED'
) t
Output:
*-------* | total | *-------* | 5 | *-------*