簡體   English   中英

PHP准備一個MySQL查詢來填充HTML表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM