2012-01-08 2 views
1

У меня такая интересная ситуация. Вот таблица с именем «mirror_data» =>Отсутствуют некоторые результаты запроса mysql

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id_mir  | int(11)  | NO | PRI | NULL | auto_increment | 
| local  | varchar(255) | YES |  | NULL |    | 
| local_mir | varchar(255) | YES |  | NULL |    | 
| remote  | varchar(255) | YES |  | NULL |    | 
| remote_mir | varchar(255) | YES |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

и вот вторая таблица с именем «данные»


+-----------------+--------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+-----------------+--------------+------+-----+---------+-------+ 
| id    | int(11)  | NO |  | 0  |  | 
| localParty  | varchar(255) | YES |  | NULL |  | 
| other columns ...            | 
+-----------------+--------------+------+-----+---------+-------+ 

Я извлечения информации из данных таблицы, но я хочу, чтобы, когда (из таблицы «данные») столбец localParty равен (таблица из «mirror_data») столбца local, затем извлекает информацию из столбца local_mir (также из таблицы «mirror_data»), в противном случае, когда отмеченные столбцы не равны друг другу, извлекают информацию из localParty. Но я хочу получить всю информацию из таблицы «данных».

здесь является mirror_data вставлено значения =>

+--------+--------+-----------+--------+------------+ 
| id_mir | local | local_mir | remote | remote_mir | 
+--------+--------+-----------+--------+------------+ 
|  1 | 715715 | Something | NULL | NULL  | 
|  2 | 1000 | some  | NULL | NULL  | 
+--------+--------+-----------+--------+------------+ 

и вот мой код, как я "делать" это =>

select IF(o.localParty=m.local,m.local_mir,o.localParty) FROM data as o, mirror_data as m limit 0,10; 

, а также здесь результат, что делает этот запрос (отсутствуют некоторые значения) =>

+---------------------------------------------------+ 
| IF(o.localParty=m.local,m.local_mir,o.localParty) | 
+---------------------------------------------------+ 
| Something           | 
| 715715           | 
| 14            | 
| 14            | 
| Something           | 
| 715715           | 
| Something           | 
| 715715           | 
| 978080           | 
| 943080           | 
+---------------------------------------------------+ 

как вы видели номер 715715 не изменилось в этом случае, потому что в mirror_data та ble - два значения (и когда их будет больше, будет больше возможности не получать ожидаемый результат), как я могу написать запрос для достижения моей цели?

Просто хочу, чтобы получить всю информацию из таблицы «данных», но с изменением (localparty), если отмечена ситуация происходит (локальный = localparty)

ответ

1

Вы должны использовать LEFT JOIN для того, чтобы включать в себя всю информацию из data таблицы и данные из mirror_table когда доступен ..

Если нет совпадения, тогда m.local_mir будет NULL, поэтому вы можете использовать IFNULL

отредактировано ответить суб-вопрос в комментариях

SELECT 
    IFNULL(m.local_mir, o.localParty) as local, 
    IFNULL(m.remote_mir, o.remoteParty) as remote 
FROM 
    data as o 
    LEFT JOIN mirror_data as m 
     ON (o.localParty = m.local OR o.remoteParty = m.remote) 
LIMIT 
    0,10; 
+0

Большого спасибо, пожалуйста, ответьте на один вопрос тоже, как этот запрос будет, если добавить удаленные, точно такие же колонки и таблицы, просто переименовать местный в удаленный, пожалуйста, ответьте :) – DaHaKa

+0

пожалуйста, когда вы увидите, что ответ, спасибо :) – DaHaKa

+0

@DaHaKa, обновленный ответ .. –

1

Вы эффективно соединяющую таблицы data и mirror_data, но не условие соединения в a WHERE, чтобы определить, как связаны две таблицы.

SELECT 
    IF(o.localParty = m.local, m.local_mir, o.localParty) 
FROM 
    data as o, 
    mirror_data as m 
/* Need an equivalent column to join on */ 
WHERE o.some_column = m.some_related_column 
limit 0,10; 

Используя новый, предпочтительный JOIN синтаксис:

SELECT 
    IF(o.localParty = m.local, m.local_mir, o.localParty) 
FROM 
    data AS o, 
    JOIN mirror_data AS m ON o.some_column = m.some_related_column 
LIMIT 0, 10;