我和我们的团队有一个关于从数据库中选择数据的有趣案例。我们想知道你们是否有不同的方法来解决这个案子。
情况如下:
我们有一个预订系统来预订页面上的"小部件"。管理员用户可以通过在后端添加uri将小部件预订到页面,如:/profile/login
.
我们当前使用的查询是这样的:
SELECT widget_type FROM cms_pages WHERE page_uri = '/profile/login';
这一切都很好。如果查询有结果,那么有一个小部件,如果没有结果(count = 0),那么管理员用户没有将小部件预订到特定的页面。
现在我们有一个看起来像/profile/login/AEJIJDOJO=
的页面。如果在那个uri上预订了一个小部件,那么上面的查询就完成了工作。如果没有一个widget被预订,那么我们需要获得在/profile/login
上被预订的widget,依此类推…
我们目前有一个monkey php解决方案,所以我们想知道是否有可能用mysql来解决这个问题?
你可以使用LIKE:
SELECT widget_type FROM cms_pages
WHERE page_uri = '/profile/login' OR page_uri LIKE '/profile/login/%'
当这只是一个经典的many_many
关系时,我会避免试图在MySQL中找到解析url的解决方案。您需要一个widget
表、一个cms_page
表和一个cms_page_has_widget
表。
然后获取一个页面的所有小部件,如:
SELECT t3.* FROM cms_page t1, cms_page_has_widget t2, widget t3
WHERE t1.id = t2.page_id
AND t3.id = t2.widget_id
AND t1.id = <page_id>
或者使用URL
SELECT t3.* FROM cms_page t1, cms_page_has_widget t2, widget t3
WHERE t1.id = t2.page_id
AND t3.id = t2.widget_id
AND t1.url = <page_url>