我有一个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
(伪代码)
我希望这对的某些人有用