0

我正在做一件小事,就像like你在 facebook 上看到的功能一样。所以我这样做的方式是这样的。我有一个名为的表products,其中包含人们可以使用的产品like。像这样(精简):

id | prodName               | status (0=clear, 1=blocked)
----------------------------------------------------------
1  | Philips Food Processor | 0
2  | Le Sharp Knife         | 0
3  | Ye Cool Fridge         | 0

Then comes the `likes` table like this:
id | prodName               | prodId | userId
--------------------------------------------
1  | Philips Food Processor | 1      | 1
2  | Le Sharp Knife         | 2      | 1
3  | Ye Cool Fridge         | 3      | 1
4  | Ye Cool Fridge         | 3      | 2

在添加到表之前,我需要检查likes具有该 id 的产品是否确实存在于 products 表中,并且它的状态 = 0。我目前使用大量 php 代码执行此操作。使用 sql 执行此操作的好方法是什么?可能吗?使用外键或类似的东西?

我正在使用 innodb 表类型。

4

6 回答 6

2

你可以做一个有条件的insert. 对于产品 6 和用户 7:

insert  into Likes
        (prodName, prodId, userId)
select  prodName
,       id
,       7
from    Products
where   id = 6
        and status = 0

如果这不插入任何行,则您知道该产品不存在,状态为 0。

于 2013-05-08T13:11:01.123 回答
0
--Check to see if cleared product exist in products table
Select count(*) from products p where p.status = 0 and p.id = %IDVALUE

--Check if your user previous liked product
Select count(*) from products p, likes l where p.id = l.prodId and l.userId = %USERID

在您的代码中,您可以执行语句(将 %IDVALUE 和 %USERID 替换为实际值)并检查返回列以获取计数并执行您的自定义逻辑。

于 2013-05-08T13:13:55.217 回答
0

目前,您需要 prodId 来填充 likes 表,因此您需要查找数据而不管有关被阻止的约束。因此:

INSERT INTO likes (prodname, prodId, userId)
SELECT prodname, id, 123456
FROM products
WHERE prodname='Le Sharp Knife'
AND status=0;

(只需将 123456 和 'Le Sharp Knife' 替换为您需要的参数)。

于 2013-05-08T13:14:18.600 回答
0

如果你只是想表达insert它遵循规则,那么你可以使用insert . . . select如下:

insert into likes(prodId, userId)
    select <prodid>, <userid>
    from products p
    where p.prodid = <prodid> and status = 0

我不认为 MySQL 支持“部分”外键约束,您也可以在其中包含对标志的要求。

而且,您不应该将产品名称放入likes表格中。你应该在products表里查一下。

于 2013-05-08T13:11:27.397 回答
0

尝试向 likes 表中添加 product 表中不存在的内容的关键要素是向用户提供反馈,让他们知道他们做错了。您确定的任何答案都不应忽略用户反馈方面的问题——这基本上需要您的 PHP 代码。

但是,是的 - 有一种方法可以通过外键来实现。您可以索引第二个表中的 prodid,并将其作为第一个 table.id 的外键引用。这意味着如果您尝试插入并且遇到错误,则问题可能是您尝试在第一个表中添加不匹配的内容。

但是,试图准确地确定错误是什么,以便您可以确定响应该错误的正确逻辑会导致其自身的大量 php 代码,并且对于未来的开发人员来说不太容易保持透明。我建议在您的 Product 对象中使用一个简单的方法: isValid( id )返回 true/false - 所以您的“检查这个”代码只是简单地if( Product.isValid( prodId ) ){ Like.insert( userId, prodId ); }

但与此同时,我真的会推荐一个外键约束以及您可能已经在使用的 php 代码,就像防止您的数据库因未链接的行而变得混乱一样。通常最好对不良数据设置多个障碍。

另外...是否有理由将产品名称同时存储在产品表和 likes 表中?我不明白为什么您需要在喜欢表中使用它。

于 2013-05-08T13:11:41.073 回答
-1

你需要查询数据库来检查记录,

例如,您的产品 ID 是2这样的,您的查询将类似于

$query = select * from 'your-like-table' where 'prodId ' = 'ID';

然后

if ( !mysql_query('your-db',$query)):

如果您遇到这种情况,那么就是您输入您喜欢的数据库的时候了

endif;

希望能帮助到你

于 2013-05-08T13:10:34.433 回答