2015-06-28 3 views
1

У меня есть приложение для Android, которое извлекает информацию из mysql db и отображает его в списке. В каждом элементе списка есть кнопка, которая после клика обновляет db с именем пользователя и элементом списка.Хранить и извлекать избранные пользователи в mysql

Я могу получить все избранные пользователи, используя реляционный и внешний ключ. То, что я пытаюсь достичь, - это когда пользователь повторно входит в приложение и прокручивает доступные предметы, он уже может видеть, какие элементы он пометил как фавориты, не перейдя на страницу избранных.

Так, например, когда вы прокручиваете страницу своего Facebook, вы уже можете видеть, какие сообщения вам нравятся.

Как я могу это достичь?

Первая таблица

|------------------|--------------|----|-------| 
|  Column  |  Type  |Null|Default 
|------------------|--------------|----|-------| 
| //**id**// | int(11) | No | 
| car_vendor | varchar(20) | No | 
| car_model  | varchar(20) | No | 
| car_petro  | varchar(10) | No | 
| car_transmition | varchar(10) | No | 
|  car_hand  | int(11) | No | 
| car_spedometer | varchar(7) | No | 
| car_engine_vol | varchar(4) | No | 
| car_category | int(11) | No | 
| car_post_date |  date  | No | 

второй стол

|----------------|------------|----| 
|  Column  | Type |Null| Default 
|----------------|------------|----| 
| //**id**// | int(11) | No | 
| username | varchar(20)| No | 
| favorites_id | int(11) | No | <<< foreign key points to ID on first table 
+0

Если вы можете разместить метаданных для ваших таблиц, это облегчит кому-то ответ. –

+0

есть две таблицы Всего автомобилей | ------ | Колонка | Тип | Null | По умолчанию | ------ | // ** Идентификатор ** // | INT (11) нет | нет | | car_vendor | varchar (20) | Нет | | car_model | varchar (20) | Нет | | car_petro | varchar (10) | Нет | | car_transmition | varchar (10) | Нет | | car_hand | int (11) | Нет | | car_spedometer | varchar (7) | Нет | | car_engine_vol | varchar (4) | Нет | | car_category | int (11) | Нет | | car_post_date | дата | Нет | Fvorites | ------ | Column | Type | Null | По умолчанию | ------ | // ** id ** // | int (11) | No | | username | varchar (20) | Нет | | избранные | int (11) | Нет | <<< запустите ключ для id collomn на табличке автомобилей. – user2145673

+1

Просто отредактируйте свой вопрос, если вы хотите добавить код – PHPeter

ответ

1

Вы можете задать дб для этой информации,

момент, когда вы получите список всех продуктов, которые вы можете сделать LEFT JOIN , который может использоваться для подключения продукта, если он понравился, пользователю. Вы можете сделать что-то подобное.

SELECT CAR_VENDOR, 
    A.CAR_MODEL, 
    A.CAR_PETRO, 
    A.CAR_TRANSMITION, 
    A.CAR_HAND, 
    A.CAR_SPEDOMETER, 
    A.CAR_ENGINE_VOL, 
    A.CAR_CATEGORY, 
    A.CAR_POST_DATE, 
    B.USERNAME 
FROM TABLE_ONE AS A 
LEFT JOIN TABLE_TWO AS B ON B.FAVORITES_ID = A.ID 
AND B.USERNAME = "actual user username" 

Этот запрос должен делать свою работу, я не проверял, но вы можете взять в качестве идеи, где начать

только объект с предпочтением должны иметь поле имени пользователя заполнено

EDIT ----------------------------------------------- -

Учитывая, что представленный ОП представлен:

  • У нас есть одна таблица, которая представляет собой список объектов (автомобилей) с их конкретными параметрами (размер двигателя, ручная работа, модель, категория и т. Д.)
  • У нас есть таблица N to N, которая может подключать каждый продукт к одному или больше пользователей и каждого пользователя к одному или нескольким продуктам
  • У нас, вероятно, есть таблица людей (столбец «имя пользователя» в таблице 2, который я хочу назвать «LIKES», должен быть внешним ключом, подключенным к первичному ключу PEOPLE table)

Поведение простое, мы хотим чего-то социального типа, когда человек может «продвигать» автомобиль, очевидно Мы не хотим, чтобы множители e голосов на том же автомобиле от одного и того же лица, таким образом, мы должны отключить функцию в случае, если он уже голосовал.

Мы берем пример обычной страницы, на которой человек уже проголосовал за некоторые продукты и хочет увидеть полный список.

В этом случае мы хотим, чтобы увидеть:

  • Перечень пункта ПОЛНОЕ, независимо от того, что.
  • Элементы, которые уже получили голос от , этот конкретный пользователь.

Один из способов обращения с этим - это соединение таблицы CARS с таблицей LIKES (для упрощения я оставляю абстракцию пользователя снаружи).

Способ использования: JOIN, соединяющий две таблицы на идентификаторе автомобиля.

Эта команда SQL вернет набор строк, которые являются комбинацией каждой строки внутри CARS, за которой следует относительное имя пользователя.

Это приведет к появлению нескольких линий для одного и того же ЦАР, по одному для каждого пользователя, которому требуется поддержка, для чего нужна бизнес-логика, чтобы справиться с проблемой показа правильной страницы.

Еще один шаг в SQL-логике - использовать LEFT JOIN.

The LEFT JOIN будет включать в себя ALL запись из первой таблицы и связать их с согласующей линии второго.

Таким образом, присоединяя CARS с LIKE на идентификаторе автомобиля И запрашивая имя пользователя, которое мы хотим, вернет полный список автомобилей (все записи слева), подключенные (и только) к записям, которые соответствуют условию, зависящему от имени пользователя ,

Пример может быть таким:

|   CARS   | 
| ID |  MODEL  | 
|------+---------------| 
| 1 +  FORD  | 
| 2 +  OPEL  | 
| 3 + FERRARI | 
| 4 +  GM  | 
|----------------------| 

|  LIKES   | 
| USERNAME | CAR_ID | 
|------------+---------| 
| KEVIN | 3 | 
| PAUL | 3 | 
|------------+---------| 

Если я использую простое соединение, как это:

SELECT ID, MODEL, USERNAME 
FROM CARS 
JOIN LIKES ON CAR_ID = ID 

Она возвращает это:

| ID | MODEL | USERNAME | 
| 3 | FERRARI | KEVIN | 
| 3 | FERRARI | PAUL | 

Это неполный

Если я себе что-то вроде этого:

SELECT ID, MODEL, USERNAME 
FROM CARS 
LEFT JOIN LIKES ON CAR_ID = ID 

Я буду иметь это:

| ID | MODEL | USERNAME | 
| 1 | FORD | NULL | 
| 2 | OPEL | NULL | 
| 3 | FERRARI | KEVIN | 
| 3 | FERRARI | PAUL | 
| 4 | GM  | NULL | 

Это все еще неправильно, даже если лучше.

Двойная запись для FERRARI будут удалены добавив условие объединения:

SELECT ID, MODEL, USERNAME 
FROM CARS 
LEFT JOIN LIKES ON CAR_ID = ID AND USERNAME = "KEVIN" 

Это вернет:

| ID | MODEL | USERNAME | 
| 1 | FORD | NULL | 
| 2 | OPEL | NULL | 
| 3 | FERRARI | KEVIN | 
| 4 | GM  | NULL | 

Это правильный список.

После того, как я получил этот список, мне нужно, чтобы показать его пользователю, проверка

if USERNAME is not NULL then DISABLE LIKE BUTTON 

(ПСЕВДОКОД)

Я надеюсь, что это полезно для кого-то

+1

чувак отличное объяснение, я немного улучшил это, используя ORDER BY, чтобы получить заказ первой таблицы, но кроме этого все работает отлично! спасибо – user2145673

+0

добро пожаловать! – Gianmarco

+0

Привет, у меня что-то странное. когда я размещаю заявление в phpmyadmin, я получаю правильный ответ от db, однако, когда я помещаю то же утверждение в php, кажется, что он принимает все до «LEFT JOIN». его, как он действует в качестве разделителя SELECT * FROM cars_for_sell LEFT JOIN user_favorite ПО cars_for_sell.id = user_favorite.favorites_id И user_favorite.username = 'Джон' И cars_for_sell.car_category = 10 ORDER BY cars_for_sell.id ответ должен вернуться в json encoding, вы знакомы с этим поведением? – user2145673

Смежные вопросы