0

I have 2 tables one (Teams) with basic team information and other (Teammeta) with all additional information structured as keys and values. I want a query where teams.id matched with teammeta.team_id and output result in the form of keys and values given in desired result.

TABLE: Teams

| id | Name       |
|----|------------|
| 1  | Glagiators |
| 2  | Sultans    |

TABLE: Teammeta

| tmeta_id | team_id | meta_key | meta_value |
|----------|---------|----------|------------|
| 1        | 1       | player1  | Joe        |
| 2        | 1       | player2  | Mark       |
| 3        | 2       | player1  | Smith      |
| 4        | 2       | player2  | Drake      |

TABLE: Desired Result

Array
(
    [0] => stdClass Object
        (
            [Name] => Glagiators 
            [player1] => Joe
            [player2] => Mark
        )
    [1] => stdClass Object
        (
            [Name] => Sultans
            [player1] => Smith
            [player2] => Drake
        )
)
Musa Butt
  • 103
  • 1
  • 7

2 Answers2

0

Sorry, misread that the first time. How about:

SELECT TeamsTable.Name, TeamMetaTableP1.meta_value AS player1, TeamMetaTableP2.meta_value AS player2
FROM teams AS TeamsTable
JOIN (SELECT * FROM teammeta) AS TeamMetaTableP1 ON TeamsTable.id = TeamMetaTableP1.team_id
JOIN (SELECT * FROM teammeta) AS TeamMetaTableP2 ON TeamsTable.id = TeamMetaTableP2.team_id
WHERE TeamMetaTableP1.meta_key = 'player1'
AND TeamMetaTableP2.meta_key = 'player2'
KiraMiller
  • 169
  • 5
  • There are too many keys, I want without using static meta_key. I can't just repeat player1, player2 everywhere in my code. – Musa Butt Feb 18 '19 at 20:49
0
SELECT Teams.Name, Teammeta.meta_key, Teammeta.meta_value FROM Teams INNER JOIN Teammeta ON Teams.id = Teammeta.team_id

will return your results as

+-------------+-------------------+---------------------+
| Teams.Name  | Teammeta.meta_key | Teammeta.meta_value |
+-------------+-------------------+---------------------+
| Galligators | player1           | Joe                 |
| Galligators | player2           | Mark                |
| Sultans     | player1           | Smith               |
| Sultans     | player2           | Drake               |
+-------------+-------------------+---------------------+

You'll need to do some parsing after that to get it in the right format.
This may help too: https://stackoverflow.com/a/12808230/9919745
EDIT:
Code for converting data

while($row = $result->fetch_assoc()){
  $name = $row['Teams.Name'];
  $data[$name][$row['Teammeta.meta_key']] = $data[$name][$row['Teammeta.meta_value']];
}
Circuit Craft
  • 184
  • 2
  • 8