2010-11-04 2 views
2

J'ai deux tables que je voudrais joindre en une, mais pas toutes les zones. J'ai utilisé INNER JOIN avec un certain succès, mais je ne peux pas obtenir les résultats exacts dont j'ai besoin. Essentiellement, lorsque j'utilise PHP pour retourner les résultats, j'aimerais que la clé soit la valeur 'meta_key'.Combinaison des résultats sur un INNER JOIN de MySQL dans un seul tableau PHP

Voici les deux tables, je veux combiner:

USERS 
+--------+-----------------+------------------+----------------+ 
| ID | username  | first_name  | last_name  | 
+--------+-----------------+------------------+----------------+ 
| 2 | hthompson  | Hunter   | Thompson  | 
| 7 | coak   | Carol   | Oak   | 
| 8 | delk   | Dannie   | Elk   | 
| 9 | mride   | Mark    | Ride   | 
| 10 | kken   | Kyle    | Ken   | 
| 11 | glee   | Ginny   | Lee   | 
| 12 | nwatts   | Naomi   | Watts   | 
| 13 | jwong   | Jin    | Wong   | 
| 14 | syin   | Shen    | Yin   | 
+--------+-----------------+------------------+----------------+ 

USERS_META 
+--------+--------+-----------------+------------------+ 
| ID | UID | meta_key  | meta_value  | 
+--------+--------+-----------------+------------------+ 
| 1 | 2 | business_name | Company Inc.  | 
| 2 | 2 | city   | New York   | 
| 3 | 2 | state   | NY    | 
| 5 | 9 | city   | Boston   | 
| 6 | 9 | state   | MA    | 
| 7 | 11 | business_type | Printer   | 
| 8 | 8 | chamber_member | true    | 
| 9 | 2 | business_type | Design   | 
+--------+--------+-----------------+------------------+ 

Voici un exemple de ce que je voudrais revenir:

USERS 
+--------+-----------------+------------+------------+------------------+ 
| ID | username  | city  | state  | business_name | 
+--------+-----------------+------------+------------+------------------+ 
| 2 | hthompson  | New York | NY   | Company Inc.  | 
+--------+-----------------+------------+------------+------------------+ 

OU

$user['ID'] = 2 
$user['username'] = hthompson 
$user['city'] = New York 
$user['state'] = NY 
$user['business_name'] = Company Inc. 

Le plus proche j'ai com e est la suivante:

$query = ("SELECT * 
FROM users 
INNER JOIN users_meta ON users.ID = users_meta.UID 
WHERE 
users_meta.meta_key = 'city' OR 
users_meta.meta_key = 'state' OR 
users_meta.meta_key = 'business_name' 
"); 

Cependant, faire ces déclarations trois résultats pour chaque ID d'utilisateur unique, et je vise à retourner une avec toutes les informations méta spécifié. Le but principal de ceci est que je serai capable de rechercher en utilisant un mot-clé, qui s'appliquerait aux colonnes USERS.first_name, USERS.first_name et USERS_META.business_name et puis renverrait évidemment les résultats dans une table montrant l'identification, le nom d'entreprise, la ville , State, First & Nom de famille.

Merci d'avance!

Répondre

0

Vous pouvez essayer ceci:

SELECT 
    u.ID, 
    u.username, 
    m0.meta_value as city, 
    m1.meta_value as state, 
    m2.meta_value as business_name 
FROM 
    users u, 
    users_meta m0, 
    users_meta m1, 
    users_meta m2 
WHERE 
    u.ID = m0.UID 
     AND m0.meta_key = 'city' 
    AND u.ID = m1.UID 
     AND m1.meta_key = 'state' 
    AND u.ID = m2.UID 
     AND m2.meta_key = 'business' 
0

En ce qui obtenir les informations sur je voudrais simplement suggérer se joindre à la table ensemble et en utilisant php pour rendre le tableau. Quelque chose de similaire à ceci:

<?php 
//if search is blank, returns all rows 
$search = isset($_POST['search'])?mysql_real_escape_string($_POST['search']):''; 

//query for all rows with meta key/values including extra 
//rows from the join. extra rows will be taken out later. 
$result = mysql_query(
    "SELECT 
     U.ID, 
     U.USERNAME, 
     U.FIRST_NAME, 
     U.LAST_NAME, 
     UM.META_KEY, 
     UM.META_VALUE 
    FROM USERS U 
     JOIN USERS_META UM ON U.ID=UM.UID 
    WHERE 
     UM.META_KEY IN ('city', 'state', 'business_name') 
     AND U.FIRST_NAME LIKE '%{$search}%'"); 

//an empty array to put our results into 
$out = array(); 

//loop through the rows 
while($row=mysql_fetch_assoc($out)){ 
    //check if the user id has been added already 
    if(!isset($out[$row['ID']])){ 
     //if not, add it with generic information 
     $out[$row['ID']] = array(
      'ID'=>$row['ID'], 
      'USERNAME'=>$row['USERNAME'], 
      'FIRST_NAME'=>$row['FIRST_NAME'], 
      'LAST_NAME'=>$row['LAST_NAME']); 
    } 
    //add the meta key and value 
    $out[$row['ID']][$row['META_KEY']] = $row['META_VALUE']; 
} 

//display 
echo '<pre>'.print_r($out,1).'</pre>'; 
?>