我有这样的数据库模型:
Post
has_many :votes
belongs_to :user
User
has_many :posts
has_many :votes
Vote
belongs_to :post
belongs_to :user
Run Code Online (Sandbox Code Playgroud)
我想要的是查询posts他尚未投票的特定用户.
我试过这样的:
Post.left_outer_joins(:votes).where.not(votes: { user_id: 1 })
Run Code Online (Sandbox Code Playgroud)
其中1只是一个示例用户ID.
问题是,这个查询好像获取所有posts这至少有一票的地方user_id不是1.
但由于不止一个用户会投票支持这些帖子,一旦有多个投票,所有用户现在都会收到所有帖子.
我不知道是否joins是正确的方法,但我的查询将是:
给我所有帖子,其中没有一个投票的user_id为1
是否有可能只posts为他尚未投票的用户提取?
编辑:
我上面三个表的数据库模式:
投票:
CREATE TABLE "votes" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"post_id" integer,
"user_id" integer,
"created_at" datetime NOT NULL,
"updated_at" datetime NOT NULL,
"vote_type" integer DEFAULT 0);
CREATE INDEX "index_votes_on_post_id" ON "votes" ("post_id");
CREATE INDEX …Run Code Online (Sandbox Code Playgroud) 我已将PHP字符集设置为utf-8:
header('Content-Type: text/html; charset=utf-8');
Run Code Online (Sandbox Code Playgroud)
我已经将currencyMySQL中的列设置为varchar(1)整理utf8_unicode_ci.
但是,PHP中的以下代码:
$currency = '€';
$sql = "UPDATE myTable SET currency = '$currency' WHERE user = '$user'";
mysql_query($sql);
Run Code Online (Sandbox Code Playgroud)
在MySQL中生成以下字符:
â
Run Code Online (Sandbox Code Playgroud)
如何让€符号在MySQL中正确存储?
我试图将我的UTF8 MySQL 5.5.30数据库转换为UTF8MB4.我看过这篇文章https://mathiasbynens.be/notes/mysql-utf8mb4但有一些问题.
我做过这些
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Run Code Online (Sandbox Code Playgroud)
最后一个用62个表手动完成,其中一个给了我这个警告
13:08:30 ALTER TABLE bradspelold.games CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci 101289 row(s)受影响,2警告:1071指定密钥太长; 最大密钥长度为767字节1071指定密钥太长; 最大密钥长度为767字节记录:101289重复:0警告:2 3.016秒
下一步是
ALTER TABLE table_name CHANGE column_name column_name
VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Run Code Online (Sandbox Code Playgroud)
编辑:
桌上游戏
CREATE TABLE `games` (
`id` int(10) unsigned NOT NULL DEFAULT \'0\',
`name` varchar(255) NOT NULL,
`description` mediumtext,
`yearPublished` …Run Code Online (Sandbox Code Playgroud) 我必须在我的数据库中注册数百万的页面浏览量,我正在寻找减少服务器负载的最佳解决方案.
1.实际解决方案:检查是否唯一,并在"原始"表和"优化"表中注册
// script
$checkUnique = mysqli_query( $con, "SELECT FROM rawTable
WHERE datatime = '$today' AND ip = '$ip'
ORDER BY datetime DESC LIMIT 1" );
mysqli_query( $con, "INSERT INTO rawTable ( id, datetime, url, ip, ua )
VALUES ( NULL, '$now', '$url', '$ip', '$ua' )" );
if( mysqli_num_rows( $checkUnique ) == 0 ) {
mysqli_query( $con, "INSERT INTO optimizedTable ( id, day, total )
VALUES ( NULL, '$today', 1 )" ); }
else{
mysqli_query( $con, "UPDATE optimizedTable SET total …Run Code Online (Sandbox Code Playgroud) 我正试着upgrade mysql进去xamp.我正在使用laravel哪个需要mariaDB v10.2.2.所以我latest msi package从中下载了mariaDB website.现在我按照以下几点安装相同的内容:
在这之后我尝试从控制面板启动mysql并显示以下错误:
现在,在检查错误日志时,我发现了这个:
2017-02-25 12:31:56 5736 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
2017-02-25 12:31:56 5736 [Note] InnoDB: Uses event mutexes
2017-02-25 12:31:56 5736 [Note] InnoDB: Compressed tables use zlib 1.2.3
2017-02-25 12:31:56 5736 [Note] InnoDB: Number of pools: 1
2017-02-25 12:31:56 5736 [Note] InnoDB: Using generic crc32 instructions
2017-02-25 12:31:56 5736 …Run Code Online (Sandbox Code Playgroud) 问这个问题之前,我搜索了stackoverflow,发现了一个类似的帖子:
mariadb galera - Error when a node shutdown ERROR 1047 WSREP尚未准备好节点供应用程序使用
但是,帖子是双节点集群,我的是三节点集群,并且在每个节点中,mariadb 都运行如下:
控制器 1:
[root@controller1 mysql]# systemctl status mariadb
? mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/mariadb.service.d
??migrated-from-my.cnf-settings.conf
Active: active (running) since Tue 2017-07-04 19:34:22 CST; 19h ago
Main PID: 3785 (mysqld)
Status: "Taking your SQL requests now..."
CGroup: /system.slice/mariadb.service
??3785 /usr/sbin/mysqld --wsrep_start_position=de05f291-60a9-11e7-a641-13dca5e08098:0
Jul 05 14:52:54 controller1 mysqld[3785]: 2017-07-05 14:52:54 139817407719168 [Note] WSREP: applier thread exiting (code:6)
Jul 05 14:52:54 controller1 …Run Code Online (Sandbox Code Playgroud) 我正在尝试建立一个先到先得的模型销售页面.我们有n个相同类型的项目.我们希望将这n个项目分配给发出请求的前n个用户.对应于每个项目,有一个数据库行.当用户按下购买按钮时,系统会尝试查找尚未售出的条目(reservationCompleted = FALSE)并更新用户ID并设置reservationCompleted为true.
由于我使用的数据库引擎是InnoDB,我知道有一个内部锁定机制,不允许两个进程在同一行上一次更新.
我的问题是,
如果我正在使用的语句如下,如果两个请求同时到达,这是否会导致不同的用户被分配到同一行?
$query = "UPDATE available_items
SET assignedPhone=".$user->phone.",
reservationCompleted = TRUE,
assignmentCreatedTimestamp =".time()."
WHERE id=".$itemListing['id']."
AND reservationCompleted=FALSE";
$stmt = $pdo->prepare($query);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
考虑以下情况.
两个不同的进程获取相同的行(比如id = 5)并尝试更新DB条目.但其中一人获得了锁定.它更新项目并释放锁定,下一个进程获得锁定.那么,它会在执行更新之前再次验证where条件吗?
我使用mysql,我在下面的表格中有两个表:
用户:
user_id - user_name - phoneUserMeta:
user_meta_id - user_id - meta_key - meta_value - meta_date
我有一些如下记录:
user_id: 23
meta_key: gender
meta_value: male
meta_date: 1534533650
user_id: 23
meta_key: city
meta_value: london
meta_date: 1534533650
user_id: 23
meta_key: name
meta_value: jack
meta_date: 1534533650
user_id: 25
meta_key: name
meta_value: Jamie
meta_date: 1534593881
user_id: 25
meta_key: gender
meta_value: male
meta_date: 1534593881
user_id: 23
meta_key: gender
meta_value: female
meta_date: 1534595971
user_id: 23
meta_key: city
meta_value: liverpool
meta_date: 1534595971
And ...
Run Code Online (Sandbox Code Playgroud)
我需要获取所有注册的最新 …
这是我的test-tab.csv如下.
\data\ hello
Run Code Online (Sandbox Code Playgroud)
注意:有一\t间 \和h中test-tab.csv,也就是说,在vim显示(组列表).
\data\^Ihello$
Run Code Online (Sandbox Code Playgroud)
准备加载数据.
create table tab(`f1` varchar(10),`f2` varchar(10));
Run Code Online (Sandbox Code Playgroud)
将数据加载到表中tab.
LOAD DATA LOCAL INFILE "f:/test-tab.csv"
INTO TABLE tab
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\r\n' \W;
Run Code Online (Sandbox Code Playgroud)
看看吧.
select * from tab;
+------------+------+
| f1 | f2 |
+------------+------+
| data hello| NULL |
+------------+------+
1 row in set (0.000 sec)
Run Code Online (Sandbox Code Playgroud)
如何将数据加载到表中tab,如下所示.
select * from tab;
+------------+------+
| f1 | f2 |
+------------+------+
| …Run Code Online (Sandbox Code Playgroud) 对于以下查询是否有更有效的解决方案.我尽力研究这个话题,但很难知道实际搜索的内容......
$tenant_balance = 0;
$total_charge_amount_query = mysqli_query($con, "
SELECT tenant_charge_id, tenant_charge_total_amount
FROM accounts_tenant_charge
WHERE tenant_charge_tenancy_id='{$tenancy_details['tenancy_id']}'"
) or die(mysql_error());
while($total_charge_amount_row = mysqli_fetch_array( $total_charge_amount_query )) {
$tenant_balance = $tenant_balance + $total_charge_amount_row['tenant_charge_total_amount'];
$total_payment_amount_query = mysqli_query($con, "
SELECT tenant_charge_payment_amount
FROM accounts_tenant_charge_payment
WHERE tenant_charge_payment_tenant_charge_id =
'{$total_charge_amount_row['tenant_charge_id']}"
) or die(mysql_error());
while($total_payment_amount_row = mysqli_fetch_array( $total_payment_amount_query )) {
$tenant_balance = $tenant_balance - $total_payment_amount_row['tenant_charge_payment_amount'];
}
}
echo '£' . number_format($tenant_balance, 2, '.', ',');
Run Code Online (Sandbox Code Playgroud)
我在下面添加了数据库表结构和一些数据.
表格1
-- phpMyAdmin SQL Dump
-- version 4.0.10.7
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- …Run Code Online (Sandbox Code Playgroud)