MySQL и PHP: извлечение данных - PullRequest
1 голос
/ 25 февраля 2009

Я застрял, пытаясь найти решение проблемы ниже. Это довольно сложно. Так что оставайтесь со мной.

Я получаю поле из таблицы user, в котором есть идентификаторы его друзей в виде CSV (3,4,5,6,7)

Существует еще одна таблица с именем transaction, которая выглядит примерно так

tid    user1   user2   type_of_trade
1       3        4      barter
2       5        6      share
3       6        7      bargain 
4       4        3      barter
5       3        7      share

Теперь мне нужно отобразить транзакции моих друзей.

Итак, я разделил CSV, поместил их в массив и для каждого друга выполняю запрос

friends = explode(",","3,4,5,6,7");

for($i=0;$i<=count(friends);$i++)
{
// I execute this--SELECT * FROM transaction WHERE user1 = friends[$i] or user2 = friends[$i]
}

Теперь то же самое происходит для 3, 4, 5, 6 и 7

Когда запрос выполняется для 4, приходит тот же результат, и поэтому я получаю дубликаты. Я перепробовал все. Но я не могу понять это.

Может кто-нибудь предложить лучшее решение или это само можно изменить?

Ответы [ 4 ]

3 голосов
/ 25 февраля 2009

В этом конкретном случае, не explode это.

SELECT * FROM transaction WHERE user1 IN (3, 4, 5, 6, 7) OR user2 IN (3, 4, 5, 6, 7)
0 голосов
/ 25 февраля 2009

Если вы вообще можете изменить дизайн базы данных, я бы порекомендовал использовать отношение «многие ко многим» для друзей ваших пользователей.

Это позволит вам сохранить список друзей пользователей без необходимости разбора CSV.

Реализация этого в PHP & mysql здесь; tonymarston.net , это был только первый результат для Google: «mysql many to many».

0 голосов
/ 25 февраля 2009

Вы можете сделать IN сравнение:

SELECT DISTINCT *
FROM transaction
WHERE user1 IN (3,4,5,6,7) OR user2 IN (3,4,5,6,7)
0 голосов
/ 25 февраля 2009

Вы должны использовать функцию mysql IN () . Это гарантирует уникальные результаты.

SELECT * FROM transactions WHERE user1 IN (3,4,5,6,7) OR user2 IN (3,4,5,6,7);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...