小编ris*_*ijd的帖子

Postgresql - 如何在表中获取另一个表中没有匹配项的条目

我有一个问题,但我真的不知道如何问它!请多多包涵:

SELECT      sc.*, 
        scd.siteid, scd.desc_frontend
FROM        shipping_code sc
LEFT OUTER JOIN shipping_code_description scd
    ON          scd.shippingid=sc.shippingid
    AND         scd.siteid IN (SELECT siteid FROM site_international WHERE published='t')
Run Code Online (Sandbox Code Playgroud)

为了解释上述情况,我们在一个名为"shipping_code"的表格中提供了运送(交付)代码,并且,由于我们有一个多语言网站,我们在"shipping_code_description"中有另一个表格来描述这些代码的语言.我们还有一个名为"site_international"的表格,其中包含以下字段:'siteid'(网站的ID - 例如英国,DE,FR ..(英语,德语,法语..)和'已发布'(布尔字段,即是网站是否有效?)

上面的SELECT查询获取所有发货代码,仅包含这些发布网站的语言描述.

现在,我们还想知道哪些运输代码在某些站点中没有描述.如果运输代码是全新的,那么将为该代码返回1行(因为LEFT OUTER JOIN).'scd.siteid'和'scd.desc_frontend'将为NULL.

但是,如果存在英国(英语)站点的描述,但不存在FR和DE的描述,则上述查询将返回一行,而不是三行.如何判断特定运输代码缺少DE和FR描述?

以下是我的选择:

1)我可以在一个查询中以某种方式完成这一切.必须有一种方法(我之前从未使用过UNION,EXCEPT等,我不确定这些是否应该使用).

2)或者我可以简单地做另一个查询来选择siteid FROM site_international WHERE published ='t'

以上将给我所有发布的网站.然后,使用PHP(我用来编码我的网站),对于上面较大的查询的每个结果,我会检查并查看是否缺少任何描述.例如,上面的siteid查询将返回3个ID(UK,DE,FR).然后,如果特定的货运代码只返回一个英国行,我就知道缺少DE和FR,我可以将其标记给我的客户.

请告知是否存在更好的选项"1"?

非常感谢!

postgresql

20
推荐指数
1
解决办法
2万
查看次数

Postgresql - 更新规则 - 可能有最后修改日期,自动更新该行的"更新"?

我想要一个"lastmodified"时间戳(或datetime?不确定它是否与数据的表示有所不同)来记录该记录的条目的最后修改日期/时间.

显然这可以使用触发器.由于我之前没有使用过触发器,我想我可以先尝试一个"更新规则",因为这对我来说也是新的:

http://www.postgresql.org/docs/8.3/static/rules-update.html

我所拥有的是此表来记录客户的会话数据:

CREATE TABLE customer_session (
    customer_sessionid serial PRIMARY KEY,
    savedsearch_contents text,
    lastmodified timestamp default now()
); /* 
    @ lastmodified - should be updated whenever the table is updated for this entry, just for reference.
     */
Run Code Online (Sandbox Code Playgroud)

然后我可以创建这样的规则.我不确定语法,或者是否使用NEW或OLD.任何人都可以建议正确的语法吗?

CREATE RULE customer_session_lastmodified AS 
ON UPDATE TO customer_session
DO UPDATE customer_session SET lastmodified = current_timestamp WHERE customer_sessionid = NEW.customer_sessionid
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我只想更新THAT customer_sessionid的最后修改条目,因此我不确定如何引用它.UPDATE查询将如下所示:

UPDATE customer_session SET savedsearch_contents = 'abcde' 
WHERE customer_sessionid = {unique customer ID}
Run Code Online (Sandbox Code Playgroud)

非常感谢!

postgresql

17
推荐指数
2
解决办法
1万
查看次数

Postgresql CASE语句 - 我可以在SELECT中使用CASE的返回值吗?

我有一个产品数据库,有多个表来存储定价(由于默认定价和每种产品颜色的可选覆盖定价),我在查询中有CASE语句,以获得产品的*原价*产品的销售价格,如果它正在出售

如果产品有售,我还需要计算产品的折扣.在我尝试这个之前,请查看我现有的SQL的细分.

SELECT  p.productid, p.stylename,
CASE    WHEN (ppo.original_price IS NOT NULL) THEN ppo.original_price ELSE pp.original_price END AS final_original_price,
CASE    WHEN (ppo.original_price IS NOT NULL) THEN ppo.sale_price ELSE pp.sale_price END AS final_sale_price

FROM product p, ... etc.
Run Code Online (Sandbox Code Playgroud)

上面的代码有效(我简化了),基本上,产品的原始价格存储在列别名"final_original_price"中,销售价格(可能为NULL)作为"final_sale_price"返回.

我现在想在SELECT中添加一行来获得折扣.我不能使用实际表中的现有字段,因为我希望返回值"final_original_price"和"final_sale_price"来进行计算.

例如

SELECT  p.productid, p.stylename,
CASE    WHEN (ppo.original_price IS NOT NULL) THEN ppo.original_price ELSE pp.original_price END AS final_original_price,
CASE    WHEN (ppo.original_price IS NOT NULL) THEN ppo.sale_price ELSE pp.sale_price END AS final_sale_price,

((final_original_price - final_sale_price) / final_original_price * 100) AS final_discount_percentage 

FROM product p, …
Run Code Online (Sandbox Code Playgroud)

postgresql

11
推荐指数
1
解决办法
3万
查看次数

我需要一个主表用于我的表,它有一个UNIQUE(复合4列),其中一个可以是NULL?

我有下表(PostgreSQL 8.3),它存储了一些产品的价格.价格与另一个数据库同步,基本上下面的大多数字段(除了一个)都没有被我们的客户更新 - 而是每隔一段时间就丢弃并刷新以与另一个库存数据库同步:

CREATE TABLE product_pricebands (
    template_sku varchar(20) NOT NULL,
    colourid integer REFERENCES colour (colourid) ON DELETE CASCADE,        
    currencyid integer NOT NULL REFERENCES currency (currencyid) ON DELETE CASCADE,
    siteid integer NOT NULL REFERENCES site (siteid) ON DELETE CASCADE,

    master_price numeric(10,2),

    my_custom_field boolean, 

    UNIQUE (template_sku, siteid, currencyid, colourid)
);
Run Code Online (Sandbox Code Playgroud)

在同步上,我基本上删除了上面的大部分数据,除了数据WHERE my_custom_field为TRUE(如果它为TRUE,则表示客户端通过其CMS更新了该字段,因此不应删除此记录).然后我将100s到1000s的行插入到表中,并且INSERT失败的UPDATE(即(template_sku,siteid,currencyid,colourid)的组合已经存在).

我的问题是 - 这里应该采用什么最佳实践来创建主键?是否需要主键?我想使主键=(template_sku,siteid,currencyid,colourid) - 但是colourid字段可以为NULL,并且无法在复合主键中使用它.

从我在其他论坛帖子上看到的内容来看,我认为我已经正确完成了上述内容,只需要澄清:

1)我是否应该使用"串行"主键以防我需要?目前我没有,也不认为我会,因为表中的重要数据是价格和我的自定义字段,只能通过(template_sku,siteid,currencyid,colourid)组合来识别.

2)由于(template_sku,siteid,currencyid,colourid)是我将用于查询产品价格的组合,我是否应该向我的列添加任何进一步的索引,例如"template_sku"是一个varchar?或者UNIQUE约束是否已成为我的SELECT的良好索引?

postgresql indexing null database-design primary-key

9
推荐指数
1
解决办法
7369
查看次数

网站优化 - 使用cookie还是使用我们的数据库?

我已经在线阅读(根据Google自己的网站优化技术建议),理想情况下使用Cookie应该保持在最低限度 - Cookie越少(内容越少)越好,因为每个HTTP请求到页面下域名还将传输cookie内容以及该请求.

我们的客户要求允许访问产品列表页面上的"保存搜索".例如,对于鞋子,我可以过滤"黑鞋"并保存我的搜索.然后,我可以将黑色鞋子过滤成"皮革",这样我就可以得到"黑色皮鞋"的过滤结果,而且我应该能够保存那个搜索.因此,保存的搜索项包括3个属性:搜索名称(由访问者输入),要保存的当前URL以及有关该页面的更多进一步描述性信息(从页面中获取).

由于访问者可以存储无限的搜索,我计划使用数组并序列化/ base64_encode它,使它成为一个字符串,我可以在需要检索/显示时解码.

如果我将它存储在一个cookie中,并且访问者保存了5个搜索,那么这就是cookie中的大量文本.你会如何建立这个?目前我可以看到两个选项:

1)坚持上述方法,仅使用cookie.为此你会:a)执行上面的serialize/base64_encode?或b)你会将多维数组"内爆"到一个字符串吗?

要么

2)您是否将所有这些信息存储在数据库中,比如将上面的序列化字符串存储在数据库中,然后为该客户分配一个唯一的ID(来自数据库)并将该ID存储在cookie中.这样,cookie只是一个数字,我们从数据库中检索其余部分.您是否会将此归类为网站速度的"优化"更好的形式?

非常感谢!

php cookies optimization

3
推荐指数
1
解决办法
118
查看次数

np.sum 和 np.add.reduce - 在生产中,你用​​什么?

作为背景,请阅读这篇快速文章和明确的答案: np.sum 和 np.add.reduce 之间的区别是什么?

所以,对于小数组,使用add.reduce速度更快。让我们看一下我为了学习而试验的以下代码,它对一个二维数组求和:

a = np.array([[1,4,6],[3,1,2]])
print('Sum function result =', np.sum(a))

# faster for small array - 
# print(np.add.reduce(a))

# but the only reduces dimension by 1. So do this repeatedly. I create a copy of x since I keep reducing it:
x = np.copy(a)
while x.size > 1:
    x = np.add.reduce(x)

print('Sum with add.reduce =', x)
Run Code Online (Sandbox Code Playgroud)

所以,上面的内容似乎有点矫枉过正——我认为当你不知道数组的大小时最好使用它sum,并且绝对如果它超过一维。add.reduce如果您的数组不明显/不小,有人会在生产代码中使用吗?如果是这样,为什么?

欢迎对代码即兴创作提出任何意见。

python numpy

1
推荐指数
1
解决办法
1635
查看次数

O(N)简单Python函数的时间复杂度

我刚接受了Codility演示测试.的问题,我的答案可以在这里看到,但我会在这里贴上我的回答也是如此.我的回复:

def solution(A):
    # write your code in Python 2.7

    retresult = 1; # the smallest integer we can return, if it is not in the array

    A.sort()
    for i in A:
        if i > 0:
            if i==retresult:   retresult += 1 # increment the result since the current result exists in the array
            elif i>retresult:   break # we can go out of the loop since we found a bigger number than our current positive integer result


    return retresult …
Run Code Online (Sandbox Code Playgroud)

python time-complexity

0
推荐指数
1
解决办法
508
查看次数