Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySQL query not returning all records

Tags:

mysql

I have a few tables in my database and am using left outer joins to join the tables and perform a query. The problem is that, not all of the matching records are returned, the first one always gets skipped out from the results for some reason.

Here's the link to the SQL Fiddle,

Schema + Test data:

mysql> select * from main;
+----------+------------+----------------+---------------+-------------+-------------+----------------+----------------+-----------------+------------+------------+----------------+-----------------+---------------+--------------------------+--------------+
| username | date       | water_quantity | water_chilled | smoked_what | smoke_count | sleep_duration | study_duration | screen_duration | loud_level | heat_level | humidity_level | stress_physical | stress_mental | stress_notes             | menstruation |
+----------+------------+----------------+---------------+-------------+-------------+----------------+----------------+-----------------+------------+------------+----------------+-----------------+---------------+--------------------------+--------------+
| test123  | 2012-09-16 |              1 | no            | cigarettes  |          20 |            480 |              0 |             420 |          2 |          7 |              7 |               6 |             4 | Roamed a lot on the bike | no           |
| test123  | 2012-09-13 |              2 | no            | cigarettes  |          12 |            300 |              0 |               0 |          1 |          1 |              1 |               6 |             3 | met friends              | no           |
+----------+------------+----------------+---------------+-------------+-------------+----------------+----------------+-----------------+------------+------------+----------------+-----------------+---------------+--------------------------+--------------+
2 rows in set (0.00 sec)

mysql> select * from food;
+----------+------------+--------------+
| username | date       | food         |
+----------+------------+--------------+
| test123  | 2012-09-16 | rice         |
| test123  | 2012-09-16 | pizza        |
| test123  | 2012-09-16 | french fries |
| test123  | 2012-09-16 | burger       |
| test123  | 2012-09-13 | naan         |
| test123  | 2012-09-13 | fried rice   |
| test123  | 2012-09-13 | lemon juice  |
+----------+------------+--------------+
7 rows in set (0.00 sec)

mysql> select * from alcohol;
+----------+------------+--------------+------------------+
| username | date       | alcohol_type | alcohol_quantity |
+----------+------------+--------------+------------------+
| test123  | 2012-09-16 | beer         |                0 |
| test123  | 2012-09-16 | beer_ale     |                0 |
| test123  | 2012-09-16 | absinthe     |                0 |
| test123  | 2012-09-13 | rum          |                0 |
| test123  | 2012-09-13 | tequila      |                0 |
+----------+------------+--------------+------------------+
5 rows in set (0.00 sec)

mysql> select * from headache;
+----------+------------+-----------+----------+---------------------+
| username | date       | intensity | duration | notes               |
+----------+------------+-----------+----------+---------------------+
| test123  | 2012-09-16 |         6 |       12 | something something |
+----------+------------+-----------+----------+---------------------+
1 row in set (0.00 sec)

mysql> select * from headache_areas;
+----------+------------+-----------------+
| username | date       | area            |
+----------+------------+-----------------+
| test123  | 2012-09-16 | left_temple     |
| test123  | 2012-09-16 | right_temple    |
| test123  | 2012-09-16 | behind_left_ear |
+----------+------------+-----------------+
3 rows in set (0.00 sec)

mysql> select * from headache_symptoms;
+----------+------------+-----------+
| username | date       | symptoms  |
+----------+------------+-----------+
| test123  | 2012-09-16 | aura      |
| test123  | 2012-09-16 | vertigo   |
| test123  | 2012-09-16 | dizziness |
+----------+------------+-----------+
3 rows in set (0.00 sec)

mysql> select * from alcohol;
+----------+------------+--------------+------------------+
| username | date       | alcohol_type | alcohol_quantity |
+----------+------------+--------------+------------------+
| test123  | 2012-09-16 | beer         |                0 |
| test123  | 2012-09-16 | beer_ale     |                0 |
| test123  | 2012-09-16 | absinthe     |                0 |
| test123  | 2012-09-13 | rum          |                0 |
| test123  | 2012-09-13 | tequila      |                0 |
+----------+------------+--------------+------------------+
5 rows in set (0.00 sec)

mysql> select * from drugs;
+----------+------------+----------+
| username | date       | drug     |
+----------+------------+----------+
| test     | 2012-08-21 | crocin   |
| test     | 2012-08-21 | azithral |
| test     | 2012-08-21 | crocin   |
| test     | 2012-08-21 | azithral |
| test     | 2012-08-21 | crocin   |
| test     | 2012-08-21 | azithral |
| test123  | 2012-09-13 | ching    |
| test123  | 2012-09-13 | chong    |
| test123  | 2012-09-13 | blah1    |
| test123  | 2012-09-13 | blurg2   |
+----------+------------+----------+
10 rows in set (0.00 sec)

Query I tried with the result:

mysql> SELECT m.*,
    ->                 GROUP_CONCAT(DISTINCT f.food SEPARATOR ',') AS food, 
    ->                 GROUP_CONCAT(DISTINCT a.alcohol_type SEPARATOR ',') AS alcohol,
    ->                 a.alcohol_quantity,
    ->                 GROUP_CONCAT(DISTINCT d.drug SEPARATOR ',') AS drug,
    ->                 h.intensity AS headache_intensity,
    ->                 h.duration AS headache_duration,
    ->                 GROUP_CONCAT(DISTINCT ha.area) AS headache_areas,
    ->                 GROUP_CONCAT(DISTINCT hs.symptoms) AS headache_symptoms,
    ->                 h.notes AS headache_notes
    ->             FROM main AS m 
    ->                 LEFT OUTER JOIN food AS f ON f.username = m.username AND f.date = m.date 
    ->                 LEFT OUTER JOIN headache AS h ON h.username = m.username AND h.date = m.date
    ->                 LEFT OUTER JOIN headache_symptoms AS hs ON hs.username = m.username AND hs.date = m.date
    ->                 LEFT OUTER JOIN headache_areas AS ha ON ha.username = m.username AND ha.date = m.date
    ->                 LEFT OUTER JOIN drugs AS d ON d.username = m.username AND d.date = m.date
    ->                 LEFT OUTER JOIN alcohol AS a ON a.username = m.username AND a.date = m.date
    ->            ;
+----------+------------+----------------+---------------+-------------+-------------+----------------+----------------+-----------------+------------+------------+----------------+-----------------+---------------+--------------------------+--------------+------------------------------------------------------------+------------------------------------+------------------+--------------------------+--------------------+-------------------+------------------------------------------+------------------------+---------------------+
| username | date       | water_quantity | water_chilled | smoked_what | smoke_count | sleep_duration | study_duration | screen_duration | loud_level | heat_level | humidity_level | stress_physical | stress_mental | stress_notes             | menstruation | food                                                       | alcohol                            | alcohol_quantity | drug                     | headache_intensity | headache_duration | headache_areas                           | headache_symptoms      | headache_notes      |
+----------+------------+----------------+---------------+-------------+-------------+----------------+----------------+-----------------+------------+------------+----------------+-----------------+---------------+--------------------------+--------------+------------------------------------------------------------+------------------------------------+------------------+--------------------------+--------------------+-------------------+------------------------------------------+------------------------+---------------------+
| test123  | 2012-09-16 |              1 | no            | cigarettes  |          20 |            480 |              0 |             420 |          2 |          7 |              7 |               6 |             4 | Roamed a lot on the bike | no           | rice,pizza,french fries,burger,naan,fried rice,lemon juice | beer,beer_ale,absinthe,rum,tequila |                0 | ching,chong,blah1,blurg2 |                  6 |                12 | left_temple,right_temple,behind_left_ear | aura,vertigo,dizziness | something something |
+----------+------------+----------------+---------------+-------------+-------------+----------------+----------------+-----------------+------------+------------+----------------+-----------------+---------------+--------------------------+--------------+------------------------------------------------------------+------------------------------------+------------------+--------------------------+--------------------+-------------------+------------------------------------------+------------------------+---------------------+
1 row in set (0.00 sec)

It doesn't show me the other record in the table. Could someone please help me out with this? Thanks in advance.

like image 691
Nitin Venkatesh Avatar asked Sep 20 '12 22:09

Nitin Venkatesh


1 Answers

It outputs exactly what you "asked it" to do (by using group concat):

USERNAME    |...| FOOD                                                       | ALCOHOL  ...
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
test123     |...| rice,pizza,french fries,burger,naan,fried rice,lemon juice |  beer,beer_ale,absinthe,rum,tequila  ...

When you use group concat it concatenates all the values of the grouped column into one output field.

Update:
I think I know understand what you're trying to achieve, since it's the same username in both records of table main it'll show as one column, to solve that you need to find the first field which is not identical for these two records - which is date. So all you have to do is add GROUP BY m.username, date to the end of your query.

like image 197
Nir Alfasi Avatar answered Oct 08 '22 20:10

Nir Alfasi