【问题标题】:PB / SQLite3 JOIN TABLESPB / SQLite3 连接表
【发布时间】:2020-07-08 18:38:18
【问题描述】:

我已经创建了 3 个表,我想要这 3 个表的数据

T1

  • idt1 - 主键
  • n1t1
  • n2t1

T2

  • idt2 - 主键
  • n1t2
  • n2t2

T3

  • idt3
  • idt1 - 外键
  • idt2 - 外键
  • n1t3
  • n2t3
  • n3t3
  • n4t3

我搜索这些信息:n1t1,n2t1,n1t2,n1t3,n2t3

代码:


$stmt = $db->prepare("SELECT t1.n1t1 AS t1_n1t1, t1.n2t1 AS t1_n2t1, t2.n1t2 AS t2_n1t2, t3.n1t3 AS t3_n1t3, t3.n2t3 AS t3_n2t3
    FROM t1
    INNER JOIN t3 ON t1.idt1 = t3.idt1
    INNER JOIN T2 ON T3.idt2 = T2.idt2
");

if ($result = $stmt->execute()) {
    $arr = $result->fetchArray();
    foreach ($arr as &$row) {
      echo "1 : " .  $row["t1_n1t1"] . "<br>";
      echo "2 : " .  $row["t1_n2t1"] . "<br>";
      echo "3 : " .  $row["t2_n1t2"] . "<br>";
      echo "4 : " .  $row["t3_n1t3"] . "<br>";
      echo "5 : " .  $row["t3_n2t3"] . "<br>";

    }
}

错误: 我有显示的值(1:2)它会有所不同并且高于错误 Warning: Illegal string offset 一些名称为 n1T1 等。

我看到我在 t3 上的 idt1 和 idt2 (FOREIGN KEY) 有一个列名:0

屏幕:

screen tables

我用一个 example.csv 插入:

n1t3;n2t3;n3t3;n4t3
123;n2a;n3a;n4a
456;n2b;n3b;n4b
789;n2c;n3c;n4c
456;n2d;n3d;n4d

代码: 我将我的 FOREINGN KEY 添加到

if (($file = fopen('exemple.csv', 'r')) === FALSE)
    echo "SQLite 3 : error CSV";

$req = $db->exec("CREATE TABLE t3 (idt3 integer PRIMARY KEY AUTOINCREMENT, idt1 integer, idt2 integer, n1t3, n2t3, n3t3, n4t3 FOREIGN KEY(idT1) REFERENCES t1(idt1), FOREIGN KEY(idt2) REFERENCES t2(idt2))");

$req = $db->prepare("INSERT INTO t3 (idt1, idt2, n1t3, n2t3, n3t3, n4t3) VALUES (:idt1, :idt2, :n1t3, :n2t3, :n3t3, :n4t3)");
 
$idt1 = 0;
$idt2 = 0;

$req->bindValue(':idt1', $idt1++, SQLITE3_INTEGER);
$req->bindValue(':idt2', $idt2++, SQLITE3_INTEGER);
...

我已经退休了第一行,在 t1 和 t3 命名表进行测试

fgetcsv($file);

但总是相同的错误代码...

新的屏幕表格:

screen tables v2

【问题讨论】:

  • 我认为您简化了代码,并且您在查询中使用的列在表中不存在。编辑您的问题并发布正确的代码。
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停整体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
  • use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。在图像中包含图例/键和说明。 PS 很难遵循这个布局,它是杂乱无章的。也很难跟上你的写作。使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。 PS 最好一次在一层内调试。显示每一层给予和得到的东西。 PS 你的第一个问题是什么?
  • 请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和站点:stackoverflow.com & 标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。

标签: php sqlite join


【解决方案1】:

每当您将具有相同列名的表连接在一起时,您必须在列名前加上表名(或别名),最好只使用该语法作为默认语法,并始终在列名前加上表名(或别名)

<?php

$stmt = $db->prepare("SELECT T1.N1 AS T1_N1, T1.N2 AS T1_N2, T2.N1 AS T2_N1, T2.N2 AS T2_N2, T3.N1 AS T3_N1, T3.N2 AS T3_N2
    FROM T1
    INNER JOIN T3 ON T1.idT1 = T3.idT1
    INNER JOIN T2 ON T3.idT2 = T2.idT2
");

if ($result = $stmt->execute()) {
    $arr = $result->fetchArray();
    foreach ($arr as &$row) {
      echo "1 : " .  $row["T1_N1"] . "<br>";
      echo "2 : " .  $row["T1_N2"] . "<br>";
      echo "3 : " .  $row["T2_N1"] . "<br>";
      echo "4 : " .  $row["T2_N2"] . "<br>";
      echo "5 : " .  $row["T3_N1"] . "<br>";
      echo "6 : " .  $row["T3_N2"] . "<br>"; 

    }
}

【讨论】:

  • 我测试过这个好方法,但是一直出现这个错误Warning: SQLite3::prepare(): Unable to prepare statement: 1, no such column: T1.n1T1
  • 好的,我已经找到了,但现在我有这个Fatal error: Call to undefined method SQLite3Stmt::fetch() 在开始我有$db = new SQLite3('exemple.db');
  • $req-&gt;fetchArray()错误Fatal error: Call to undefined method SQLite3Stmt::fetchArray()
  • 我有显示的值(1:2)它会变化并且高于错误``警告:非法字符串偏移``在某些名称上作为n1T1等..
  • 啊,好吧,我想我明白了,我以为你上面列出的是列名,再次更改代码,但是你能发布每个表的表结构吗?
猜你喜欢
  • 2020-11-04
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多