1

私は次のテーブルを持っています:

users (id,name)
items (id,title)
users_items (user_id,item_id)

usersitemsかなり自明である必要があります。users_itemsユーザーがアイテムを「お気に入り」にしたかどうかを保持します。したがって、ID5のユーザーがID7のお気に入りのアイテムを持っている場合、users_itemsテーブルはuser_idとitem_idのレコード(5,7)をそれぞれ保持します。

すべてのアイテムを出力できるようにしたいのですが、現在ログインしているユーザーがそのアイテムを気に入っているかどうかを各アイテムの横に表示します。

明らかに、すべてのアイテムを取得してからループし、別のmysql呼び出しを実行して、関連するユーザーIDとレッスンIDを持つusers_itemsから行が返されるかどうかを確認できますが、1つの関数でこれを行うためのより良い方法があります。たぶん、いくつかの派手な参加で?

前もって感謝します。

4

6 に答える 6

6
SELECT * FROM items LEFT JOIN users_items ON items.id=users_items.item_id AND user_id=1 -- change user_id

PHP では、次のステップは true と評価されるかどうかを確認することです。

if ($row['item_id'])
{
    // Yes
}
else {
    // No
}
于 2012-07-10T14:10:59.727 に答える
0

これには を使用できますCASE

SELECT i.*, CASE WHEN ui.user_id IS NOT NULL THEN 1 ELSE 0 END
FROM Item i
LEFT OUTER JOIN User_Item ui on ui.item_id = i.id AND ui.user_id = current_user_id
于 2012-07-10T14:12:16.007 に答える
0
SELECT i.id, i.title, 
    CASE WHEN ui.item_id IS NOT NULL 
        THEN 'Favorite' 
    ELSE 'Not Favorite'
FROM items i
LEFT JOIN users_items ui ON ui.item_id = i.id
WHERE ui.user_id = some_variable;
于 2012-07-10T14:14:43.547 に答える
0

このSELECTクエリを試してください:

SELECT *
FROM items i
LEFT JOIN users_items ui on ui.user_id=i.id  and ui.id = curUserId 
于 2012-07-10T14:10:59.587 に答える
0
select i.id, i.name, count(ui.item_id) 
from items i
left outer users_items ui on i.id = ui.item_id
    and ui.user_id = 123
group by i.id, i.name
于 2012-07-10T14:11:04.383 に答える
0

次のことを試してください。

SELECT I.*, CASE WHEN UI.item_id IS NULL THEN 'No' ELSE 'Yes' END FavouritedByUser
FROM items I
LEFT JOIN ( SELECT item_id
            FROM users_items 
            WHERE user_id = @CurrentUser) UI
ON I.id = UI.item_id
于 2012-07-10T14:11:33.433 に答える