Использование GROUP CONCAT в запросе my-sql с таблицей wp_usermeta - PullRequest
1 голос
/ 14 марта 2012

У меня есть запрос, который предназначен для возврата сведений о пользователях из таблиц Wordpress. Было бы хорошо, если бы я просто ВЫБИРАЛ имена столбцов, которые мне нужны, но в Wordpress есть таблица пользовательских мета, которая имеет 2 столбца - 1 с именем metakey и 1 с именем meta value.

Я хочу получить определенные биты пользовательской информации из мета-ключей, таких как first_name и last_name, но все они находятся в одном столбце - metavalue.

Вот что у меня есть:

    $allquery="SELECT $comma_separated, wp_usermeta.meta_value, wp_usermeta.meta_key, 
//comma_seperated are a list of values to search for seperate by ",". this is name, email
    GROUP_CONCAT(
        wp_usermeta.meta_value
        ORDER BY wp_usermeta.meta_key
    ) AS name
    FROM wp_users
    LEFT JOIN wp_usermeta
    ON wp_users.ID = wp_usermeta.user_id
    WHERE  (wp_usermeta.meta_key = 'first_name'
        OR wp_usermeta.meta_key = 'last_name')
        AND wp_users.user_login = '$spec_user'
    GROUP BY wp_users.ID";

    $names = array();
    $allresult=mysql_query($allquery) or die(mysql_error()); 

    while($rows=mysql_fetch_array($allresult)){  

        $names[] = $rows['name']; //name is from the group_concat in query
        $emails[] = $rows['user_email']; 
    }

Проблема в том, что это просто возвращает одну строку. Я думаю, что это может быть связано со строкой:

AND wp_users.user_login = '$spec_user'

Где $ spec_user - введенное пользователем значение.

В идеале мне нужны все строки, в которых столбец user_login равен тому, что ввел пользователь. Не только из этой таблицы, но из таблицы usermeta.

EDIT @nnichols, я, вероятно, не стал объяснять это правильно ...

Это пользовательская таблица:

ID    userlogin    password    email        date-registered
2     jay          xxxxxx      xxx@xxx.xcom 1/2/12
5     pete         xxxxxx      xxxx@xxx.com 2/2/12

А это таблица usermeta:

umetaid     userid    meta_key     meta_value
122         2         first_name   james
123         5         first_name   peter
155         2         last_name    jones
167         5         last_name    gould
168         2         DOB          16/8/89
190         5         DOB          23/5/70

Поэтому я пытаюсь объединить значения из одного запроса в цикл PHP, чтобы добавить их в массив следующим образом:

$names = array();
$dob = array();

$allresult=mysql_query($allquery) or die(mysql_error()); 

while($rows=mysql_fetch_array($allresult)){  

    $names[] = $rows['name']; //name is from the group_concat in query
    $emails[] = $rows['user_email']; 
    $dob[] = $rows['custom_field_dob']; 

}

У меня уже есть имя и фамилия в одном массиве, names []. Но как бы я достиг этого, по существу, таблица usermeta трактовала метаключ DOB, например, как столбец, чтобы я мог вытянуть весь контент в массив и оказаться в «строке» samme как другие пользовательские данные.

1 Ответ

0 голосов
/ 16 мая 2012

Вы можете использовать следующий sql для достижения своей цели, возможно, потребуется изменить имя таблицы, имя поля и т. Д. ......

SELECT distinct(user.id),

(SELECT GROUP_CONCAT(u2.meta_value SEPARATOR ' ') FROM usermeta as u2 where u2.user_id=user.id and (u2.meta_key='first_name' OR u2.meta_key='last_name')) AS name,

user.email as user_email,(SELECT u3.meta_value from usermeta u3 where u3.user_id=user.id and u3.meta_key='DOB') AS custom_field_dob

FROM user, usermeta WHERE usermeta.user_id = user.id

См. Изображение ниже ... enter image description here

...