Query
SELECT SQL_NO_CACHE
`Table1`.`recordID`
FROM
`Table1`
LEFT JOIN `Table3` ON `Table3`.`table1RecordID`=`Table1`.`recordID`
WHERE
(`Table3`.`status` = '3' OR `Table3`.`status` = '4') AND
(`Table1`.`groupName` = 'Sample Name')
GROUP BY `Table3`.`recordID` ASC, `Table1`.`recordID` ASC;
Explain
+----+-------------+--------+--------+------------------------------+---------+---------+------------------------------+-------+----------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+--------+--------+------------------------------+---------+---------+------------------------------+-------+----------------------------------------------+ | 1 | SIMPLE | Table3 | ALL | fk_packageID,regStatus,pkgID | NULL | NULL | NULL | 11322 | Using where; Using temporary; Using filesort | | 1 | SIMPLE | Table1 | eq_ref | PRIMARY,groupName | PRIMARY | 4 | testDb.Table3.table1RecordID | 1 | Using where | +----+-------------+--------+--------+------------------------------+---------+---------+------------------------------+-------+----------------------------------------------+
If I remove the second part of the GROUP BY, "Table1.recordID ASC" but data isn't correct when I do that. Why is it doing this and how can I fix it and still group down by Table1 in addition to the Table3 first.
Thanks in advanced!
Update 1/24/14
I had time to take the full query and pull the tables to a generic form to post without client data. I was able to add schema to sqlfiddle but without the data I'm using results can be different and I was even unable to put 100 rows pre-table (7 total) into sqlfiddle due to limitations of characters. So instead I've done a dump of the tables and I'm sharing it over dropbox.
Dropbox
https://www.dropbox.com/s/9fgu626996utpar/stackoverflow-21291707_test_db_schema_and_data.sql
Query
SELECT
`t1`.`name` AS `Object1.Name`,
GROUP_CONCAT(DISTINCT
IF(`t5`.`questionID`=68,
IF(`t6`.`writeInRequired` = 1,
CONCAT(
`t6`.`value`,
':', `t5`.`writeInResponse`
),
`t6`.`value`
),
NULL
) SEPARATOR ', ') AS `Object3.Response_68`,
GROUP_CONCAT(DISTINCT
IF(`t5`.`questionID`=67,
IF(`t6`.`writeInRequired` = 1,
CONCAT(
`t6`.`value`,
':', `t5`.`writeInResponse`
),
`t6`.`value`
),
NULL
) SEPARATOR ', ') AS `Object3.Response_67`,
GROUP_CONCAT(DISTINCT
IF(`t5`.`questionID`=66,
IF(`t6`.`writeInRequired` = 1,
CONCAT(
`t6`.`value`,
':', `t5`.`writeInResponse`
),
`t6`.`value`
),
NULL
) SEPARATOR ', ') AS `Object3.Response_66`,
`t7`.`firstName` AS `Object8.FirstName`,
`t7`.`lastName` AS `Object8.LastName`,
`t7`.`email` AS `Object8.Email`,
`t1`.`recordID` AS `Object1.PackageID`,
`t3`.`recordID` AS `Object5.RegistrationID`
FROM
`Table1` t1
LEFT JOIN `Table2` t2 ON `t1`.`recordID`=`t2`.`table1RecordID`
LEFT JOIN `Table3` t3 ON `t3`.`table1RecordID`=`t1`.`recordID`
LEFT JOIN `Table4` t4 ON `t4`.`table3RecordID`=`t3`.`recordID` AND `t4`.`type` = 1
LEFT JOIN `Table5` t5 ON `t5`.`objectID`=`t3`.`recordID` AND `t5`.`objectType`='Type2'
LEFT JOIN `Table6` t6 ON `t6`.`recordID`=`t5`.`table6RecordID`
JOIN `Table7` t7 ON `t7`.`recordID`=`t4`.`table7RecordID`
WHERE
`t3`.`status` IN ('3','4')
GROUP BY
`Object5.RegistrationID` ASC,
`Object1.PackageID` ASC
EXPLAIN EXTENDED (/G)
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t7
type: ALL
possible_keys: PRIMARY
key: NULL
key_len: NULL
ref: NULL
rows: 11627
filtered: 100.00
Extra: Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: t4
type: ref
possible_keys: idx_table7RecordID,idx_table3RecordID
key: idx_table7RecordID
key_len: 5
ref: testDb.t7.recordID
rows: 1
filtered: 100.00
Extra: Using where
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: t3
type: eq_ref
possible_keys: PRIMARY,table1RecordID_status,idx_status,idx_table1RecordID
key: PRIMARY
key_len: 4
ref: testDb.t4.table3RecordID
rows: 1
filtered: 100.00
Extra: Using where
*************************** 4. row ***************************
id: 1
select_type: SIMPLE
table: t5
type: ref
possible_keys: compositeIDs
key: compositeIDs
key_len: 773
ref: const,testDb.t3.recordID
rows: 5
filtered: 100.00
Extra:
*************************** 5. row ***************************
id: 1
select_type: SIMPLE
table: t6
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: testDb.t5.table6RecordID
rows: 1
filtered: 100.00
Extra:
*************************** 6. row ***************************
id: 1
select_type: SIMPLE
table: t1
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: testDb.t3.table1RecordID
rows: 1
filtered: 100.00
Extra:
*************************** 7. row ***************************
id: 1
select_type: SIMPLE
table: t2
type: ref
possible_keys: idx_table1RecordID
key: idx_table1RecordID
key_len: 5
ref: testDb.t1.recordID
rows: 85
filtered: 100.00
Extra: Using index
7 rows in set, 1 warning (0.13 sec)
EXPLAIN EXTENDED (ASCII TABLE)
+----+-------------+-------+--------+-------------------------------------------------------------+--------------------+---------+--------------------------+-------+----------+---------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+--------+-------------------------------------------------------------+--------------------+---------+--------------------------+-------+----------+---------------------------------+ | 1 | SIMPLE | t7 | ALL | PRIMARY | NULL | NULL | NULL | 11627 | 100.00 | Using temporary; Using filesort | | 1 | SIMPLE | t4 | ref | idx_table7RecordID,idx_table3RecordID | idx_table7RecordID | 5 | testDb.t7.recordID | 1 | 100.00 | Using where | | 1 | SIMPLE | t3 | eq_ref | PRIMARY,table1RecordID_status,idx_status,idx_table1RecordID | PRIMARY | 4 | testDb.t4.table3RecordID | 1 | 100.00 | Using where | | 1 | SIMPLE | t5 | ref | compositeIDs | compositeIDs | 773 | const,testDb.t3.recordID | 5 | 100.00 | | | 1 | SIMPLE | t6 | eq_ref | PRIMARY | PRIMARY | 4 | testDb.t5.table6RecordID | 1 | 100.00 | | | 1 | SIMPLE | t1 | eq_ref | PRIMARY | PRIMARY | 4 | testDb.t3.table1RecordID | 1 | 100.00 | | | 1 | SIMPLE | t2 | ref | idx_table1RecordID | idx_table1RecordID | 5 | testDb.t1.recordID | 85 | 100.00 | Using index | +----+-------------+-------+--------+-------------------------------------------------------------+--------------------+---------+--------------------------+-------+----------+---------------------------------+
Thanks again in advanced!
For @Strawberry
Removed select clauses and just select the recordID of the first table. This query still produces the same explain from above.
SELECT
`t1`.`recordID`
FROM
`Table1` t1
LEFT JOIN `Table2` t2 ON `t1`.`recordID`=`t2`.`table1RecordID`
LEFT JOIN `Table3` t3 ON `t3`.`table1RecordID`=`t1`.`recordID`
LEFT JOIN `Table4` t4 ON `t4`.`table3RecordID`=`t3`.`recordID` AND `t4`.`type` = 1
LEFT JOIN `Table5` t5 ON `t5`.`objectID`=`t3`.`recordID` AND `t5`.`objectType`='Type2'
LEFT JOIN `Table6` t6 ON `t6`.`recordID`=`t5`.`table6RecordID`
JOIN `Table7` t7 ON `t7`.`recordID`=`t4`.`table7RecordID`
WHERE
`t3`.`status` IN ('3','4')
GROUP BY
`t3`.`recordID` ASC,
`t1`.`recordID` ASC;
explainswith\Grather than;- Strawberry