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

时间:2015-06-28 12:13:31

标签: mysql sql left-join

我有一个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 

1 个答案:

答案 0 :(得分: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"

这个查询应该做的工作,我没有测试它,但你可以把它作为一个想法从哪里开始

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

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

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

  • 我们有一个表,它是一个具有特定参数(引擎大小,手,模型,类别等)的对象(汽车)列表。
  • 我们有一个N到N的表,可以将每个产品连接到一个或多个用户,每个用户连接到一个或多个产品
  • 我们可能有一个人员表(&#34;用户名&#34;表2中的列,我希望调用&#34; LIKES&#34;应该是连接到PEOPLE中主键的外键表)

行为很简单,我们想要一些像社会一样的人,可以在这个地方投资#34;一辆车,显然我们不希望同一辆车在同一辆车上多次投票因此我们必须在他/她已经投票的情况下禁用该功能。

我们举一个例子,一个人已经投票了一些产品,并且希望看到完整的清单。

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

  • COMPLETE 项目清单,无论如何。
  • 已经从特定用户投票的项目。

处理此问题的一种方法是将CARS表与LIKES表连接(我将用户的字形留在外面以简化)。

执行此操作的方法是使用 JOIN 连接汽车ID上的两个表。

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

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

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

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

因此,将carS与LIKE加入car-id并询问我们想要的用户名,将返回连接到(并且仅限于)与用户名相关条件的记录的完整汽车列表(左起所有记录)。

示例可以是:

|         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

(伪代码)

我希望这对某人有用