Py学习  »  Paul Spiegel  »  全部回复
回复总数  4
8 年前
回复了 Paul Spiegel 创建的主题 » 在MySQL中生成唯一字符串的最简单方法是什么?[重复]

您可以使用以下命令生成随机字母数字字符串:

lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0);

你可以把它用在 BEFORE INSERT 触发并检查while循环中是否存在重复:

CREATE TABLE `vehicles` (
    `plate` CHAR(8) NULL DEFAULT NULL,
    `data` VARCHAR(50) NOT NULL,
    UNIQUE INDEX `plate` (`plate`)
);

DELIMITER //
CREATE TRIGGER `vehicles_before_insert` BEFORE INSERT ON `vehicles`
FOR EACH ROW BEGIN

    declare str_len int default 8;
    declare ready int default 0;
    declare rnd_str text;
    while not ready do
        set rnd_str := lpad(conv(floor(rand()*pow(36,str_len)), 10, 36), str_len, 0);
        if not exists (select * from vehicles where plate = rnd_str) then
            set new.plate = rnd_str;
            set ready := 1;
        end if;
    end while;

END//
DELIMITER ;

现在只需像这样插入数据

insert into vehicles(col1, col2) values ('value1', 'value2');

触发器将为 plate

( sqlfiddle demo )

如果列允许空值,则这种方式有效。如果希望它不为NULL,则需要定义一个默认值

`plate` CHAR(8) NOT NULL DEFAULT 'default',

如果不需要大写字母数字,也可以在触发器中使用任何其他随机字符串生成算法。但触发器将考虑独特性。

6 年前
回复了 Paul Spiegel 创建的主题 » mysql:从两个表中组合信息的查询

使用左连接:

SELECT g.name, g.id as userId, COUNT(i.userId) as nbr_entries
FROM generic g
LEFT JOIN info i ON i.userId = g.id
GROUP BY g.id
ORDER BY nbr_entries DESC

这样,您还将包括没有信息条目的用户,并获得 0 作为 nbr_entries .

你可以从这里开始:

SELECT a.PERSON, a.IN, b.OUT, TIMESTAMPDIFF(SECOND, a.IN, b.OUT) AS TOTAL
FROM presence a
LEFT JOIN presence b ON b.id = (
  SELECT MIN(b2.id)
  FROM presence b2
  WHERE b2.PERSON = a.person
    AND b2.id > a.id
    AND b2.OUT IS NOT NULL
)
WHERE a.IN IS NOT NULL
ORDER BY a.IN;

它将返回:

PERSON      IN                      OUT                     TOTAL
-----------------------------------------------------------------
Person F    2019-03-11 07:35:00     2019-03-11 15:28:10     28390
Person E    2019-03-11 07:35:20     2019-03-11 15:15:50     27630
Person D    2019-03-11 07:58:50     2019-03-11 15:14:20     26130
Person C    2019-03-11 08:04:40     2019-03-11 13:19:50     18910
Person B    2019-03-11 08:32:00     2019-03-11 14:57:00     23100
Person A    2019-03-11 08:59:30     2019-03-11 15:00:50     21680

Demo

查询连接一行,该行的值为 IN 同一个人的下一行 OUT . 这假设 id 是自动递增主键,数据正确。

现在可以将其更改为按查询分组。

6 年前
回复了 Paul Spiegel 创建的主题 » php-mysql联合查询

自从 MySQL5.7.22 你可以用 JSON_OBJECTAGG(key, value) :

SELECT post_id, JSON_OBJECTAGG(meta_key, meta_value) AS meta_data
FROM wp_postmeta
WHERE post_id IN (SELECT id from wp_posts WHERE post_type = 'product')
GROUP by post_id

这个会回来的 meta_data 作为json_对象 key: value 对:

post_id | meta_data
   2549 | {"_sku": "HCS-DGMP", "_weight": "0.50", "_virtual": "no", "_featured": "no", "_sale_price": null, "_tax_status": "taxable", "_visibility": "visible", "total_sales": "0", "_regular_price": "18.99", "_product_attributes": "a:0:{}"}

Demo

如果服务器不支持 JSON_OBJECTAGG() ,我将使用一个PHP解决方案:

$postIds = array_unique(array_column($dbResult, 'post_id'));

$posts = [];
foreach ($postIds as $id) {
    $posts[$id] = (object)['id' => $id];
}

foreach ($dbResult as $row) {
    $posts[$row->post_id]->{$row->meta_key} = $row->meta_value;
}

echo json_encode(array_values($posts), JSON_PRETTY_PRINT);

结果:

[
    {
        "id": "2549",
        "total_sales": "0",
        "_virtual": "no",
        "_tax_status": "taxable",
        "_visibility": "visible",
        "_featured": "no",
        "_weight": "0.50",
        "_sku": "HCS-DGMP",
        "_product_attributes": "a:0:{}",
        "_regular_price": "18.99",
        "_sale_price": ""
    }
]

Demo

只要您不处理数千行,我就不会担心性能。