我正在做一件小事,比如你在facebook上看到的like
功能。所以我这样做的方式是这样的。我有一个名为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表中并且其status = 0.我目前使用大量php代码执行此操作。使用sql做这个的好方法是什么?可能吗?使用外键或类似的东西?
我正在使用innodb表类型。
答案 0 :(得分:2)
您可以执行条件insert
。对于产品6和用户7:
insert into Likes
(prodName, prodId, userId)
select prodName
, id
, 7
from Products
where id = 6
and status = 0
如果这不插入任何行,则表示该产品不存在,状态为0。
答案 1 :(得分: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
表格中查找。
答案 2 :(得分:0)
尝试向产品表中不存在的likes表添加内容的关键元素是对用户的反馈,让用户知道他们做错了。您确定的任何答案都不应忽略用户反馈方面的事情 - 这基本上需要您的PHP代码。
但是,是的 - 有一种方法可以通过外键来实现。您可以索引第二个表中的prodid,并将其作为第一个table.id的外键引用。这意味着如果您尝试插入并且出现错误,则问题可能是您尝试在第一个表中添加没有匹配项的内容。
然而,试图确切地确定错误是什么,以便您可以确定响应该错误的正确逻辑导致其自身的大量PHP代码,并且对于未来的开发人员来说不太容易透明。我建议在您的Product对象中使用一个简单的方法:isValid( id )
返回true / false - 因此,“检查此代码”只需if( Product.isValid( prodId ) ){ Like.insert( userId, prodId ); }
但与此同时,我真的推荐一个外键约束以及你可能已经使用的php代码,就像保护你的数据库变得混乱没有链接的行一样。通常最好对坏数据设置多个障碍。
此外......您是否有理由将产品名称存储在产品表和相似表中?我不明白为什么你需要它在喜欢的表中。
答案 3 :(得分: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替换为实际值)并检查返回列以获取计数并执行自定义逻辑。
答案 4 :(得分: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'代替你需要的参数)。
答案 5 :(得分:-1)
Yuo需要查询数据库来检查记录,
例如,您的产品ID为2
,因此您的查询类似于
$query = select * from 'your-like-table' where 'prodId ' = 'ID';
然后
if ( !mysql_query('your-db',$query)):
如果你遇到这种情况,那么就是你输入数据库的时候了
endif;
希望有所帮助