MySQL выборка со сравнением

282
03 декабря 2017, 14:11

Несколько компьютеров отсылают данные.

Каждая машина отсылает:

[Объект 1], Значение А: [некое_число], Значение Б: [некое_число]
[Объект 2], Значение А: [некое_число], Значение Б: [некое_число]
...

Объектов может быть аж до 500-600, названия разные. Однако каждая машина отсылает одинаковые названия для каждого объекта (что логично).

Значений на Объект от одной машины только 2: А и Б.

Задача:

Сравнить Значения между Машинами по Объектам так, чтобы вывести данные, если выполнено следующее условие:

(Значение А = 2, а Значение Б > 5) или (Значение Б = 2, а Значение А > 5)
или
(Значение А = 3, а значение Б > 6) или (Значение Б = 3, а Значение А > 6)

Между всеми машинами. При этом, чтобы сравнение было только между Значениями А и Б (А-А и Б-Б недопустимо), на разных машинах (т.е. А одной машины и Б другой. А и Б одной машины не сравниваются) при одинаковых Объектах (т.е. данные Объекта 1 нельзя сравнивать с данными Объекта 2).

Пример:

Таблица с данными:

         | Маш 1 | Маш 2 | Маш 3 | Маш 4 |
         | А | Б | А | Б | А | Б | А | Б |
------------------------------------------
Объект 1 | 3 | 5 | 0 | 0 | 2 | 1 | 2 | 2 |
Объект 2 | 3 | 4 | 1 | 3 | 7 | 2 | 2 | 2 |
Объект 3 | 2 | 6 | 1 | 4 | 2 | 1 | 2 | 2 |

По данной таблице должно получится:

Объект 2, Маш 4 (Б = 2), Маш 3 (А = 7)
Объект 3, Маш 3 (А = 2), Маш 1 (Б = 6)
Объект 3, Маш 4 (А = 2), Маш 1 (Б = 6)
Объект 2, Маш 2 (Б = 3), Маш 3 (А = 7)

Не обязательно в таком формате, главное - название объекта, какая машина, какие данные и по какому значению (А, или Б).

Таблица в БД аналогичная, столбцы: ID (ключ), Объект, Маш1А, Маш1Б, Маш2А ...

Тип поля Объект - char(30), всё остальное - int.

Никак не соображу, как составить запрос так, чтобы сделать такую выборку (каким образом её осуществить). Или последовательно 2 выборки (при первом = 2, втором более 5 и при первом = 3, втором более 6).

Answer 1

Структура неправильная, действительно, как написал Mike. С предложенной им структурой:

ID, Объект, Машина, A, B

можно делать такие запросы:

SELECT a.object, a.mashina, a.A, a.B, b.object, b.mashina, b.A, b.B
FROM test2 AS a
JOIN test2 AS b 
ON b.id != a.id AND b.object = a.object
WHERE (a.B = 2 AND b.A > 5) 
OR (b.A = 2 AND a.B > 5) 
OR (a.B = 3 AND b.A > 6) 
OR (b.A = 3 AND a.B > 6)

UPD. теперь все условия в одном запросе.

Вариант, предложенный Mike:

select X.object, X.machine, Y.machine, C,
       case when (X.A=C and Y.B > D) then Y.B else Y.A end
  from test2 X, test2 Y,
       (select 2 C, 5 D union all select 3, 6) Z
 where X.object=Y.object and X.machine!=Y.machine
   and ( (X.A=C and Y.B > D) or (X.B=C and Y.A > D) )

Работает так: берутся 2 таблицы, к ним добавляются поля С и D для каждой строчки. вот так:

То есть каждая строчка дублируется. И потом уже из этой выборки получается нужный результат.

READ ALSO
Как получить данные которые идут после # в адресной cтроке

Как получить данные которые идут после # в адресной cтроке

Вк при получение token'a с разрешением wall делает редирект на страницу типа

243
Yii2 возвращает NULL для пустых полей в БД

Yii2 возвращает NULL для пустых полей в БД

Вытаскиваю список полей с БД

343
Вложение изображений в сообщение

Вложение изображений в сообщение

Как вложить изображение в сообщение?

292
Mysql соединение для демона

Mysql соединение для демона

Пишу проект, в котором серверная часть на PHP запускается в режиме демона, те

217