2013-02-15 7 views
1

У меня есть следующий запрос, но это один возвращает 3 строки и я хочу одну строку ;-)Объединение нескольких строк в одну

SELECT 
b_firstname ,value 
FROM 
cscart_user_profiles 
RIGHT JOIN profile_fields_data ON profile_fields_data.object_id = user_profiles.profile_id 
WHERE 
user_profiles.b_title NOT LIKE '' 
AND user_profiles.profile_id = '4252' 
AND (
    profile_fields_data.field_id ='69' 
    OR 
    profile_fields_data.field_id ='73' 
    OR 
    profile_fields_data.field_id ='75' 
) 

... но это вернет 3 строки:

user1 value 
user1 value 
user1 value 

Я хочу 1 строку:

user1 value69 user73 value75

Как я могу решить эту проблему?

Ниже 2 таблицы, где данные является

CREATE TABLE IF NOT EXISTS `cscart_user_profiles` (
    `profile_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
    `user_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    `profile_type` char(1) NOT NULL DEFAULT 'P', 
    `b_title` varchar(32) NOT NULL DEFAULT '', 
    `b_firstname` varchar(128) NOT NULL DEFAULT '', 
    `b_lastname` varchar(128) NOT NULL DEFAULT '', 
    `b_address` varchar(64) NOT NULL DEFAULT '', 
    `b_address_2` varchar(64) NOT NULL DEFAULT '', 
    `b_city` varchar(64) NOT NULL DEFAULT '', 
    `b_county` varchar(32) NOT NULL DEFAULT '', 
    `b_state` varchar(32) NOT NULL DEFAULT '', 
    ...... 
    PRIMARY KEY (`profile_id`), 
    KEY `uid_p` (`user_id`,`profile_type`), 
    KEY `profile_type` (`profile_type`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ; 

CREATE TABLE IF NOT EXISTS `cscart_profile_fields_data` (
    `object_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    `object_type` char(1) NOT NULL DEFAULT 'U', 
    `field_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    `value` varchar(255) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`object_id`,`object_type`,`field_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
+1

Рассмотрите возможность размещения схемы базы данных и данных образца. – Minesh

+0

@minesh, ты что? – Bas

ответ

1

Вы можете присоединиться к столу profile_fields_data 3 отдельные раз, чтобы получить 3 отдельных значений в одной строке.

SELECT b_firstname, 
     pfd69.value as value69, 
     pfd73.value as value73, 
     pfd75.value as value75 

FROM cscart_user_profiles AS up 

     RIGHT JOIN cscart_profile_fields_data AS pfd69 
     ON pfd69.object_id = up.profile_id  
     AND pfd69.field_id ='69' 

     RIGHT JOIN cscart_profile_fields_data AS pfd73 
     ON pfd73.object_id = up.profile_id  
     AND pfd73.field_id ='73' 

     RIGHT JOIN cscart_profile_fields_data AS pfd75 
     ON pfd75.object_id = up.profile_id  
     AND pfd75.field_id ='75' 

WHERE up.b_title NOT LIKE '' 
     AND up.profile_id = '4252' 
+0

один правый соединение хорошо работает, но 3 нет. Я получаю эту ошибку: # 1066 - Не уникальная таблица/псевдоним: 'cscart_profile_fields_data' – Bas

+0

Повторите попытку сейчас. В исходном SQL вы вошли в таблицу profile_fields_data, а не cscart_profile_fields_data. Я обновил свой SQL. Я также исправил проблему с псевдонимами с моим предложением where. – Tom

+0

Он работает !!! Благодаря!!! Я не могу голосовать за репутацию ;-) Но спасибо! – Bas

0

Вы можете использовать вложенные запросы?

SELECT * FROM (
    SELECT User1, Value69 FROM table) AS T1 
INNER JOIN (
    SELECT User2, Value75 FROM table) AS T2 ON T1.Somevalue = T2.Somevalue 

т.д.

Но, не видя вашу схему, трудно написать полезный пример

+0

Что вам нужно от меня? – Bas

Смежные вопросы