пропуская некоторые результаты из запроса MySQL - PullRequest
1 голос
/ 08 января 2012

У меня такая интересная ситуация.Вот таблица с именем «mirror_data» =>

+------------+--------------+------+-----+---------+----------------+
| 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    |                |
+------------+--------------+------+-----+---------+----------------+

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


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

Я получаю информацию из таблицы данных, но яхотите, чтобы, когда (из таблицы «data») столбец localParty равнялся столбцу (таблица из «mirror_data») локального, то извлекал информацию из столбца 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 есть два значения (и когда их будет больше, это будетбольше возможностей не получить ожидаемый результат), как я могу написать запрос для достижения моей цели?

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

Ответы [ 2 ]

1 голос
/ 08 января 2012

Вы должны использовать 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;
1 голос
/ 08 января 2012

Вы фактически объединяете таблицы data и mirror_data, но не имеете условия объединения в предложении 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...