2015-01-29 6 views
1

Вот таблицы:Выберите таблицу на основе значения из другой таблицы

info 
+----------------------+ 
|userid|job_id|position| 
+----------------------+ 
|1  |1  |2  | 
|2  |2  |1  | 
+----------------------+ 

job 
+----------------+ 
|job_id|job_title| 
+----------------+ 
|1  |army  | 
|2  |grocer | 
+----------------+ 

army 
+-----------------------+ 
|position|title |income| 
+------------------------+ 
|1  |private |$125 | 
|2  |corporal|$175 | 
+------------------------+ 

grocer 
+-----------------------+ 
|position|title |income| 
+-----------------------+ 
|1  |bagger |$100 | 
|2  |cashier|$120 | 
+-----------------------+ 

Я хотел бы:

+----------------------------+ 
|id|job_title|position|income| 
+----------------------------+ 
|1 |army  |corporal|$175 | 
+----------------------------+ 

для когда идентификатор 1 опознан и

+----------------------------+ 
|id|job_title|position|income| 
+----------------------------+ 
|2 |grocer |bagger |$100 | 
+----------------------------+ 

за все время идентификатор 2 регистрируется в

так,

if job_title=army 

then select table army and info.position=army.position 

if job_title=grocer 

then select table grocer and info.position=grocer.position 

я наклоняю вполне понять это. Я попытался

SELECT * FROM info,job,army,grocer 
WHERE userid='$userid' and passid='$passid' and info.job_id=job.job_id; 

, который работает для job_title, но не title ни income. Так что я попытался

SELECT * FROM info,job,army,grocer 
WHERE userid='$userid' and passid='$passid' and info.job_id=job.job_id and info.position=army.position; 

который работал ид 1 но не идентификатор 2. Мне нужно что-то вроде

SELECT * FROM info,job,army,grocer 
WHERE userid='$userid' and passid='$passid' and info.job_id=job.job_id and info.position=_.position; 

где _ либо армии или бакалейщик, на основе идентификатора пользователя и position

+2

нормализует свои данные и все такие проблемы будут уходить , –

+0

Не принимайте это неправильно, но лучший способ сделать то, что вы просите, совершенно противоречит тому, что вы настроили. В идеале вы должны создать таблицу 'position', которая объединяет все позиции и присваивает« внешний ключ »заданию, которому назначен каждый пользователь. Разбивание ваших таблиц, которые связаны каким-то образом, вызывает только такие неприятности, которые, в свою очередь, также могут вызывать очень медленные и дорогостоящие запросы. Посмотрите * нормализацию базы данных * для получения дополнительной информации. – RhapX

ответ

0

Попробуйте это:

--drop table #info 
SELECT * 
INTO #info 
FROM  
(
    select 1 as userid , 1 as job_id, 2 as position 
     UNION 
    select 2 as userid , 2 as job_id, 1 as position 
) a 

--drop table #job 
SELECT * 
into #job 
FROM  
(
SELECT 1 as job_id , 'army' as job_title 
    union 
SELECT 2 as job_id , 'grocer' as grocer 
) a 

--drop table #army 
SELECT * 
into #army 
FROM  
(
select 1 as position , 'private' as title, 125 as income 
    union 
select 2 as position , 'corporal' as title, 175 as income 
) a 

--drop table #grocer 
SELECT * 
into #grocer 
FROM  
(
select 1 as position , 'bagger' as title, 100 as income 
    union 
select 2 as position , 'cashier' as title, 120 as income 
) a 


--for whenever id 1 is logged in: 
SELECT a.userid as Id, b.job_title, c.title as position, c.income 
FROM #info a 
    inner join #job b 
     on a.job_id = b.job_id 
    inner join #army c 
     on a.position = c.position 
where a.userid = 1 

--for whenever id 2 is logged in: 
SELECT a.userid as Id, b.job_title, c.title as position, d.income 
FROM #info a 
    inner join #job b 
     on a.job_id = b.job_id 
    inner join #army c 
     on a.position = c.position 
    inner join #grocer d 
     on c.position = d.position 
where a.userid = 2