2017-01-20 9 views
0

Мне нужно подготовить запрос из таблицы MySQL в PHP, используя подготовленный оператор, чтобы построить таблицу часов работы с часами на нескольких языках. Исходным языком является английский (т. Е. ru), поэтому, если для языка сеанса не существует значения (например, fr), тогда он должен вернуть резервный язык ru.PHP подготовить запрос MySQL для заполнения таблицы 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 это поле, так что я должен пройти .

Для запасного языка я могу использовать 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

Учитывая, что вы разбираете массив в PHP anyaway, я просто не понимаю, почему вы беспокоить с group_concat – Strawberry

+0

@Strawberry или как вы хотите группировать значение строки? с этим массивом быстро построить таблицу html с помощью explode, может быть, я ошибаюсь или есть другое решение, очищающее –

+0

, вы должны применить условие на языке вашего SQL, привязав к языку сеанса (или 'en', если нет определены). Предоставьте свой PHP-код, который подходит для подготовки инструкции SQL и привязки аргументов. – trincot

ответ

1

Вместо того чтобы выбирать все языковые записи, выберите только английские, а внешние присоедините их к выбранному языку. Затем используйте 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 
+0

Работайте отлично спасибо;) –

+0

Добро пожаловать, -) – trincot

 Смежные вопросы

  • Нет связанных вопросов^_^