2016-11-04 4 views
2

Мне нужно построить сложный mysql-запрос. У меня есть таблица с некоторой информацией о пользователе, с тремя столбцами: id, id_user, id_campo, valore. Так, например:Построить MySql Query с несколькими условиями, где условия

  • 1, 1, 1, «Roberto» (где id_campo = 1 для имени пользователя);
  • 2, 2, 1, "Luca";
  • 3, 1, 2, "Windows"; (где id_campo = 2 для используемой ОС);
  • 4, 2, 2, "Linux"; и так далее.

Теперь я должен выбрать пользователей, где: имя = "Роберто" и ОС = "Linux", но тот же пользователь:

SELECT id_user WHERE (id_campo=1 AND valore="Roberto") OR (id_campo=2 AND valore="Linux"). 

В этом примере случае, обратный запрос id_user = 1 и id_user = 2, но я не получил бы никакого результата. Как я могу изменить запрос, чтобы включить условие «тот же пользователь»?

Спасибо!

+2

Вы знаете, что база данных, построение не так, верно? Это не то, как должна работать реляционная база данных/таблица. Вы не используете отношения mulitple, используя одни и те же столбцы для разных данных. И почему вы не можете просто получить строки, соответствующие «id_user»? – junkfoodjunkie

+1

Почему оператор 'FROM' пропущен? – RomanPerekhrest

+0

Почему не так? У меня есть таблица пользователей, таблица «campo» и таблица «user_spec». Таким образом, пользователь может иметь разные значения user_spec («Roberto», «Luca», «Windows», «Linux», ...), которые содержатся в «campo» («Name», «OS», «email»,. ..). Если это неправильно, как я могу лучше всего изменить структуру db? благодаря – cent89

ответ

1

Вам нужно построить два «подзапроса», а затем присоединиться к ним по идентификатору пользователя.

SELECT a.id_user 
from (
    SELECT id_user FROM table 
    WHERE (id_campo=1 AND valore="Roberto") 
) a, 
(
    SELECT id_user FROM table 
    WHERE (id_campo=2 AND valore="Linux") 
) b 
WHERE a.is_user = b.id_user 
1

У вас есть неправильный дизайн дб, но в любом случае вы можете USIE внутреннее соединение на одной и той же таблицы на основе id_user

select a.id_user, a.id_campo, a.valore 
    from my_table as a 
    inner join my_table as b on .id_user = b-id_user 
    where (a.id_campo = 1 and a.valore ='Roberto') 
    AND (b.id_campo = 2 and b.valore ='Linux') 
Смежные вопросы