Объединение результатов в MySQL INNER JOIN в один массив PHP - PullRequest
2 голосов
/ 04 ноября 2010

У меня есть две таблицы, которые я хотел бы объединить в одну, но не все поля.Я использовал INNER JOIN с некоторым успехом, но не могу получить точные результаты, которые мне нужны.По сути, при использовании PHP для возврата результатов я бы хотел, чтобы ключом было значение «meta_key».

Ниже приведены две таблицы, которые я хочу объединить:

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           |
+--------+--------+-----------------+------------------+

Ниже приведен пример того, что я хотел бы вернуть:

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

ИЛИ

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

Самое близкое, что я пришел, это:

$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'
 ");

Тем не менее, выполнение этого возвращает три результата для каждого уникального идентификатора пользователя, и я собираюсь вернуть один со всей указанной мета-информацией.Основная цель этого заключается в том, чтобы я мог выполнять поиск по ключевому слову, которое будет применяться к столбцам USERS.first_name, USERS.first_name и USERS_META.business_name, а затем, очевидно, будет возвращать результаты в таблице, содержащей ID, название компании, город, Штат, Имя и Фамилия.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 04 ноября 2010

Что касается получения информации, я бы просто предложил объединить таблицу и использовать php для создания массива. Нечто похожее на это:

<code><?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).'
'; ?>
0 голосов
/ 04 ноября 2010

Вы можете попробовать это:

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...