![](/img/trans.png)
[英]2 table MYSQL PHP query and application with PHP to populate a HTML grid display
[英]PHP prepare a MySQL query to populate HTML table
我必須使用准備好的語句從PHP的MySQL表中准備一個查詢,以便以多種語言構建一個營業時間的HTML表。 后備語言是英語(即en ),因此,如果會話語言(例如fr )不存在任何值,則它應返回后備語言en 。
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是公司,因此我必須傳遞公司ID,在這種情況下為15,而att_id是字段,因此我必須傳遞260 。
對於后備語言,我可以在同一張表上使用帶有JOIN的COALESCE 。
它可以工作,但返回兩倍的結果,而不是一個。 使用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
如果會話語言為fr,則結果為:
[{"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"}]
如果會話語言為en,則結果為:
[{"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"}]
應該返回什么:
如果會話語言為fr :
[{"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"}]
如果會話語言為en :
[{"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"}]
我究竟做錯了什么?
除了選擇所有語言記錄之外,僅選擇英語記錄,然后將所選語言的記錄外連接。 然后使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.