2015-07-01 2 views
0

У меня есть этот запрос, который отлично работает. Нет ошибок или что-то еще. Но, похоже, он не работает с последней частью и не заполняет последние три поля из cd contact_data.SQL-запрос, не отображающий нужный результат

select c.*,cd.* FROM 
(select * from 
(select con.id_contact as v,substr(concat(ifnull(con.firstname,''),ifnull(con.lastname,'')),1,4) as s0, null as s1, null as s2 
from contact con where id_user=123 and firstname != '' and firstname != ' ' and firstname is not null) as tbl235768 where 1=1 AND v IN 
(select v from 
    (select * from 
     (select con.id_contact as v,substr(concat(ifnull(con.firstname,''),ifnull(con.lastname,'')),1,4) as s0, null as s1, null as s2 
     from contact con where id_user=123 and email = '') as tbl235770 where 1=1) as tblAnd) AND v IN 
     (select v from 
      (select * from (select con.id_contact as v,substr(concat(ifnull(con.firstname,''),ifnull(con.lastname,'')),1,4) as s0, null as s1, null as s2 
      from contact con where id_user=123 and mobile != '' and mobile != ' ' and mobile is not null) as tbl235772 where 1=1) as tblAnd)) as tblBucket 
      left join contact c on c.id_contact=v left join 
      (select id_contact, group_concat(name) as custom_names,group_concat(value) as custom_values FROM contact_data where 
      id_user=20 group by id_contact) as cd on cd.id_contact=c.id_contact group by (c.id_contact) 

Но, если я запускать только последнюю часть, которая имеет следующий вид

select id_contact, group_concat(name) as custom_names,group_concat(value) as custom_values 
FROM contact_data where id_user=798 group by id_contact 

Это дает мне желаемого результата. что не так с моим запросом? Любая помощь будет очень признательна, спасибо.

Редактировать: я редактирую свой вопрос после получения нескольких ответов.

Я удалил все вложенные части, но все равно не повезло.

select c.*,cd.* FROM (select * from (select con.id_contact as v,substr(concat(ifnull(con.firstname,''),ifnull(con.lastname,'')),1,4) as s0, null as s1, null as s2 from contact con where id_user=10879) as tbl235785 
where 1=1) as tblBucket left join contact c on c.id_contact=v left join (select id_contact, group_concat(name) as custom_names,group_concat(value) as  custom_values 
FROM contact_data where id_user=798 group by id_contact) as cd on cd.id_contact=c.id_contact group by (c.id_contact) 
+0

вложенные вложенные вложенные подзапросы .... – HaveNoDisplayName

+0

Проверить, если вы используете правильный присоединиться функции: http://stackoverflow.com/questions/38549/difference-between-inner-and-outer-joins? –

+0

Вы используете псевдоним V дважды. Плюс Вы выбираете одно поле, но на выбранный вами запрос *. Они могут быть очищены. – Chuck

ответ

1

В одном месте вы согласование в id_user = 10879, а затем в другом подзапросоме вы сопрягая на id_user = 798, то вы соединяете два и так как поля id_user оба смотрите на различные номерах, вы получите нет совпадений в вашем соединении.

+0

Если вы напишете свой запрос только одним совпадением на id_user, он будет более чистым, а объединения будут автоматически фильтровать данные. Если вы хотите, чтобы оба числа, возможно, id_user in (798, 10879) – Chuck

+0

Это была проблема с id_user, она была жестко запрограммирована, и я не обратил внимания. Моя ошибка в курсе :), но большое спасибо. – Shaonline

+0

Рад, что вы получили его! – Chuck

2

Вот ваш SQL сделал проще:

Все в 1 = 1 и SELECT * FROM (подзапрос) может уйти - они ничего не делают. Тогда логика становится понятной - вам просто нужны дополнительные предложения для вашего оператора where вместо подзапросов. Я думаю, когда он будет очищен, как вы можете видеть - в первом выборе у вас есть id_user=123, а во втором - id_user=20.

Возможно, вы хотите, чтобы все было одинаково? Вы даже не нуждаетесь в необходимости предложения where во втором соединенном select. Поскольку он присоединен, вы должны просто присоединить это поле к значению во внешнем запросе.

select c.*,cd.* 
FROM (select con.id_contact as v,substr(concat(ifnull(con.firstname,''),ifnull(con.lastname,'')),1,4) as s0, null as s1, null as s2 
     from contact con 
     where id_user=123 and 
       firstname != '' and firstname != ' ' and firstname is not null 
      and 
      email = '' 
       OR 
      (
       mobile != '' and mobile != ' ' and mobile is not null 
      ) 
    ) as tbl235768 
left join contact c on c.id_contact=v 
left join (select id_contact, group_concat(name) as custom_names,group_concat(value) as custom_values 
      FROM contact_data 
      where id_user=20 
      group by id_contact 
     ) as cd on cd.id_contact=c.id_contact 
group by (c.id_contact) 
Смежные вопросы