Heim > Fragen und Antworten > Hauptteil
Ich versuche eine Möglichkeit zu finden, einem Datenbankanrufdatensatz basierend auf einer Telefonnummernspalte eine Landesvorwahl hinzuzufügen. Ich habe eine Tabelle, die Länder und ihre Vorwahlen (sogenannte Länder) enthält. Ich kann alle Datensätze abfragen und den Ländercode anhängen, aber ich muss in der Lage sein, die Ergebnisse zu filtern und zu paginieren.
Ich arbeite mit einem System, über das ich nicht viel Kontrolle habe, daher sind das Hinzufügen neuer Spalten zu Tabellen oder das Umschreiben großer Codeblöcke keine wirklichen Optionen. Damit muss ich klarkommen.
Landtisch.
id | Name | Vorwahl |
---|---|---|
1 | Irland | 353 |
2 | USA1 |
Datum und Uhrzeit des Starts | Enddatum und Uhrzeit | route_id | Telefonnummer | duration_seconds | |
---|---|---|---|---|---|
2014-12-18 18:51:12 | 2014-12-18 18:52:12 | 23 | 3538700000 | 60 | |
2014-12-18 17:41:02 | 2014-12-18 17:43:02 | 43 | 18700000 | 120 |
Zahlen | Aktiviert | |||||
---|---|---|---|---|---|---|
1234567890 | 1 | |||||
0987654321 | 1 |
id | Datum und Uhrzeit des Starts | Enddatum und Uhrzeit | route_id | Telefonnummer | duration_seconds | country_id |
---|---|---|---|---|---|---|
1 | 2014-12-18 18:51:12 | 2014-12-18 18:52:12 | 23 | 3538700000 | 60 | 1 |
2 | 2014-12-18 17:41:02 | 2014-12-18 17:43:02 | 43 | 18700000 | 120 | 2 |
P粉1214472922024-01-11 12:27:31
从 routes
到 callrecord_join
的 RIGHT JOIN
没有任何作用,因为您已经在之间有了 INNER JOIN
子查询中的 routes
和 callrecord
,位于联接的右侧。
您可以使用您所描述的联接 -
JOIN countries c ON LEFT(a.phonenumber, LENGTH(c.dialling_code)) = c.dialling_code
但它会给出相同的结果:
JOIN countries c ON a.phonenumber LIKE CONCAT(c.dialling_code, '%')
应该会稍微便宜一些。
您应该测试对国家/地区
的加入,以确保callrecord
中的任何号码都不会加入多个国家/地区。某些国际拨号代码不明确,因此这取决于您使用的拨号代码列表。
SELECT a.*, COUNT(*), GROUP_CONCAT(c.dialling_code) FROM callrecord a JOIN country c ON a.phonenumber LIKE CONCAT(c.dialling_code, '%') GROUP BY a.id HAVING COUNT(*) > 1;
显然,如果您的数据集非常大,您将需要对上述查询进行批处理。
我希望我没有过分简化事情,但根据我对你的问题的理解,查询只是:
SELECT r.id AS route_id, r.number AS route_number, c.name AS country_name, SUM(a.duration_seconds) AS total_duration, COUNT(a.id) AS total_calls, COUNT(DISTINCT a.phonenumber) AS unique_numbers FROM callrecord AS a JOIN routes AS r ON a.route_id = r.id JOIN countries c ON a.phonenumber LIKE CONCAT(c.dialling_code, '%') WHERE a.startdatetime >= '2014-12-18' AND a.startdatetime < '2014-12-19' AND r.isenabled = 1 GROUP BY r.id, r.number, c.name LIMIT 10 offset 0;
请注意,假设有合适的索引可用,请注意从 startdatetime
中删除 DATE_FORMAT()
以使这些条件可控制。