1

したがって、2つの質問があり、最初の質問は$ _SESSIONに基づいて配列を選択し、次に2番目の選択で使用されます。

私の問題は、たとえば1つのエントリを使用する場合、すべてが問題ないということです。テーブルは次のようになります。

|DATA| USER1|
|DATA| USER2|
|DATA| USER3|

しかし、同じユーザーのエントリが必要な場合は、次のように重複します。

|DATA| USER1| [1]
|DATA| USER1| [2]
|DATA| USER2|
|DATA| USER3|
|DATA| USER1| DUPLICATE of FIRST ENTRY USER ABOVE [1]
|DATA| USER1| DUPLICATE OF SECOND ENTRY USER ABOVE [2]

私のコードは次のようになります:

function make_table($user_id){
   first_query with this select `Select U.user_id
                                   from users U, tasks T
                                  where T.assigned_to = U.user_id 
                                    and T.status='Assigned'
                                    and U.parent_id = $_SESSION[userid]`;

  foreach ($query_result_worker as $row){
            $user_id_worker = $row['user_id'];

  //second_query with this select 

    SELECT T.task_id, T.job_server_id, T.TIMESTAMP, TT.task_type_name, T.STATUS,
           UO.username AS customer_name, UO.user_id AS customer_id, T.STATUS, T.quantity,
           T.order_id, U.username, T.priority, T.assigned_time, U.username, O.order_id
     FROM task_type TT, orders O, users UO, task_assignment T
     LEFT JOIN users U
        ON T.assigned_to = U.user_id
     WHERE T.task_type_id = TT.task_type_id
        AND O.order_id = T.order_id
        AND O.user_id = UO.user_id
        AND T.STATUS = 'Assigned'
        AND T.assigned_to = $ROW [user_id]
        AND T.TIMESTAMP <= CURRENT_TIMESTAMP
     ORDER BY T.priority DESC, DATE (T.TIMESTAMP), T.quantity DESC, T.task_id

    foreach ($result as $tablerow) {
    make the printing table stuff

     }
}

だから、2つのエントリを取得したときになぜ重複しているのかわかりません。助けてください。

PS:同じユーザーに3つのエントリがある場合、同じユーザーには6つになり、重複します。

4

1 に答える 1

3

DISTINCT最初のクエリに追加してみてください:

SELECT DISTINCT U.user_id
FROM
    users U,
    tasks T
WHERE
    T.assigned_to = U.user_id
    AND T.status='Assigned'
    AND U.parent_id = $_SESSION[userid];

また、特に明示的な外部結合と混合する場合は、暗黙的な結合の使用を避けます。クエリが少し読みにくくなり、(IMO)間違いが起こりやすくなります。INNER JOIN代わりに構文を使用してください。

2番目のクエリは次のようになります。

SELECT
    T.task_id,
    T.job_server_id,
    T.TIMESTAMP,
    TT.task_type_name,
    T.STATUS,
    UO.username AS customer_name,
    UO.user_id AS customer_id,
    T.STATUS,
    T.quantity,
    T.order_id,
    U.username,
    T.priority,
    T.assigned_time,
    U.username,
    O.order_id
FROM
    task_type TT
    INNER JOIN task_assignment T
        ON T.task_type_id = TT.task_type_id
    INNER JOIN orders O
        ON O.order_id = T.order_id
    INNER JOIN users UO
        ON UO.user_id = O.user_id
    LEFT JOIN users U
        ON T.assigned_to = U.user_id
WHERE
    T.STATUS = 'Assigned'
    AND T.assigned_to = $ROW[user_id]
    AND T.TIMESTAMP <= CURRENT_TIMESTAMP
ORDER BY
    T.priority DESC,
    DATE(T.TIMESTAMP),
    T.quantity DESC,
    T.task_id
于 2012-09-20T12:56:12.880 に答える