PHP готовит запрос MySQL для заполнения таблицы HTML

Я должен подготовить запрос из таблицы MySQL в PHP, используя подготовленный оператор, чтобы построить HTML-таблицу часов работы на нескольких языках. Резервным языком является английский (т.е. ан) поэтому, если не существует значения для языка сеанса (например, фр), то он должен вернуть запасной язык ан.

TABLE_A

id  | att_id | item_id | lang | row | col | value
1   | 260    | 15      | en   | 0   | 0   | Monday
2   | 260    | 15      | en   | 0   | 1   | 10:30 - 15:00
3   | 260    | 15      | en   | 0   | 2   | 18:30 - 24:00
4   | 260    | 15      | fr   | 0   | 0   | Lundi
5   | 260    | 15      | fr   | 0   | 1   | 10:30 - 15:00
6   | 260    | 15      | fr   | 0   | 2   | 18:30 - 24:00
7   | 260    | 15      | en   | 1   | 0   | Tuesday
8   | 260    | 15      | en   | 1   | 1   | 10:30 - 15:00
9   | 260    | 15      | en   | 1   | 2   | 18:30 - 24:00
10  | 260    | 15      | fr   | 1   | 0   | Mardi
11  | 260    | 15      | fr   | 1   | 1   | 10:30 - 15:00
12  | 260    | 15      | fr   | 1   | 2   | 18:30 - 24:00
13  | 260    | 15      | en   | 2   | 0   | Wednesday
14  | 260    | 15      | en   | 2   | 1   | 10:30 - 15:00
15  | 260    | 15      | en   | 2   | 2   | 18:30 - 24:00
16  | 260    | 13      | en   | 0   | 0   | Monday
17  | 260    | 13      | en   | 0   | 1   | 10:30 - 15:00
18  | 260    | 13      | en   | 0   | 2   | 18:30 - 24:00

item_id это компания, поэтому я должен передать идентификатор компании, в данном случае 15, и att_id это поле, поэтому я должен пройти 260.

Для резервного языка я могу использовать COALESCE с JOIN на той же таблице.

Это работает, но возвращает двойные результаты, а НЕ один. С COALESCE он должен вернуть первый результат NOT NULL.

Это выбор:

SELECT
TABLE_A.item_id, TABLE_A.row,
GROUP_CONCAT(TABLE_A.col) AS col, TABLE_A.value,

GROUP_CONCAT(COALESCE(
(
SELECT
TABLE_A.value FROM TABLE_A
WHERE
TABLE_A.item_id = '15' AND
TABLE_A.att_id = '260' AND
TABLE_A.row = T.row AND
TABLE_A.col = T.col AND
TABLE_A.langcode = 'fr'
),
(
SELECT
TABLE_A.value FROM TABLE_A
WHERE
TABLE_A.item_id = '15' AND
TABLE_A.att_id = '260' AND
TABLE_A.row = T.row AND
TABLE_A.col = T.col AND
TABLE_A.langcode = 'en'
)
)) AS name

FROM TABLE_A

JOIN TABLE_A AS T ON T.id = TABLE_A.id

WHERE TABLE_A.att_id = '260' AND TABLE_A.item_id = '15' GROUP BY TABLE_A.row

Если язык сеанса фр это результат:

[{"row":"0","col":"0,0,1,1,2,2","value":"Lundi,Lundi,10:30 - 15:00,10:30 - 15
:00,18:30 - 24:00,18:30 - 24:00"},{"row":"1","col":"0,0,1,1,2,2","value":"Mardi,Mardi,10
:30 - 15:00,10:30 - 15:00,18:30 - 24:00,18:30 - 24:00"},{"row":"2","col":"0,0,1,1,2,2","value":"Wednesday,
Wednesday,10:30 - 15:00,10:30 - 15:00,18:30 - 24:00,18:30 - 24:00"}]

Если язык сеанса ан это результат:

[{"row":"0","col":"0,0,1,1,2,2","value":"Monday,Monday,10:30 - 15:00,10:30 - 15
:00,18:30 - 24:00,18:30 - 24:00"},{"row":"1","col":"0,0,1,1,2,2","value":"Tuesday,Tuesday,10
:30 - 15:00,10:30 - 15:00,18:30 - 24:00,18:30 - 24:00"},{"row":"2","col":"0,0,1,1,2,2","value":"Wednesday,
Wednesday,10:30 - 15:00,10:30 - 15:00,18:30 - 24:00,18:30 - 24:00"}]

Что должно вернуться:

Если язык сеанса фр:

[{"row":"0","col":"0,1,2","value":"Lundi,10:30 - 15
:00,18:30 - 24:00"},{"row":"1","col":"0,1,2","value":"Mardi,10
:30 - 15:00,18:30 - 24:00"},{"row":"2","col":"0,1,2","value":"Wednesday,10:30 - 15:00,18:30 - 24:00"}]

Если язык сеанса ан:

[{"row":"0","col":"0,1,2","value":"Monday,10:30 - 15
:00,18:30 - 24:00"},{"row":"1","col":"0,1,2","value":"Tuesday,10
:30 - 15:00,18:30 - 24:00"},{"row":"2","col":"0,1,2","value":"Wednesday,10:30 - 15:00,18:30 - 24:00"}]

Что я делаю неправильно?

0

Решение

Вместо выбора всех языковых записей, выберите только английские, а внешние соедините записи для выбранного языка. Тогда используйте coalesce сначала использовать значение из второй таблицы, а затем (как запасной вариант) из первой:

SELECT      a.item_id,
a.row,
GROUP_CONCAT(a.col) AS col,
GROUP_CONCAT(COALESCE(b.value, a.value)) AS name
FROM        TABLE_A a
LEFT JOIN   TABLE_A b
ON a.item_id = b.item_id
AND a.att_id = b.att_id
AND a.row = b.row
AND a.col = b.col
AND b.langcode = ?
WHERE       a.langcode = 'en'
AND a.att_id = ?
AND a.item_id = ?
GROUP BY    a.row
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector