在mysql中存储和检索用户收藏夹



我有一个android应用程序,它从mysql-db中提取信息,并将其显示在列表中。每个列表项都有一个收藏夹按钮,单击该按钮后会使用用户名和列表项更新数据库。

我可以使用关系键和外键获取所有用户收藏夹。我试图实现的是,当用户重新登录应用程序并滚动可用项目时,他已经可以看到哪些项目被标记为收藏夹,而无需转到收藏夹页面。

例如,当你在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 

您可以向数据库询问该信息,

当你得到所有产品的列表时,你可以做一个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"

这个查询应该可以完成工作,我没有测试它,但你可以把在哪里启动作为一个想法

只有具有首选项的对象才应具有填充的用户名字段

编辑----------------------------------------------------

以OP提出的案例为例,我们有:

  • 我们有一个单独的表,它是一个对象(汽车)的列表,以及它们的特定参数(发动机尺寸、手、型号、类别等)
  • 我们有一个N到N表,可以将每个产品连接到一个或多个用户,并将每个用户连接到一种或多种产品
  • 我们可能有一个人员表(表二的"username"列,我想称之为"LIKES",应该是连接到people表中主键的外键)

行为很简单,我们想要一些社交功能,比如一个人可以"支持"一辆车,显然我们不希望同一个人对同一辆车投多票,因此我们必须禁用该功能,以防他/她已经投票。

我们以一个普通页面为例,其中一个人已经对一些产品进行了投票,并希望看到完整的列表。

在这种情况下,我们希望看到:

  • 完成项目列表,无论发生什么
  • 已经获得特定用户投票的项目

处理这一问题的一种方法是将CARS表与LIKES表连接起来(我将用户的拼写留在外面以简化)。

实现这一点的方法是使用JOIN连接汽车id上的两个表。

此SQL命令将返回一组行,这些行是CARS中每一行的组合,后跟相对用户名。

这将导致同一CAR有多行,每个投票用户有一行,需要一个业务逻辑来处理显示正确页面的问题。

SQL逻辑中的另一个步骤是使用LEFT JOIN。

LEFT JOIN将包括第一个表中的ALL记录,并将它们与第二个表的匹配行连接。

因此,在car id上使用LIKE加入CARS并询问我们想要的用户名,将返回连接到(并且仅连接到)符合用户名相关条件的记录的汽车的完整列表(从左起所有记录)。

例如:

|         CARS         |
|  ID  |     MODEL     |
|------+---------------|
|   1  +     FORD      |
|   2  +     OPEL      |
|   3  +    FERRARI    |
|   4  +      GM       |
|----------------------|
|        LIKES         |
|  USERNAME  |  CAR_ID |
|------------+---------|
|   KEVIN    |    3    |
|    PAUL    |    3    |
|------------+---------|

如果我使用这样一个简单的JOIN:

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

(伪代码)

我希望这对的某些人有用

最新更新